vue3+ts+uniapp+vite+pinia项目配置

news2024/10/5 13:44:26

开发环境: node >=18,npm >=8.10.2,vue <= 3.2.31

安装项目

npx degit dcloudio/uni-preset-vue#vite-ts vue3-uniapp

1、引入样式规范

npm add -D eslint eslint-config-airbnb-base eslint-config-prettier eslint-import-resolver-typescript eslint-plugin-import eslint-plugin-prettier eslint-plugin-vue @typescript-eslint/eslint-plugin @typescript-eslint/parser vue-global-api 
  1.  .editorconfig

    # .editorconfig 文件
    root = true
    
    [*] # 表示所有文件适用
    charset = utf-8 # 设置文件字符集为 utf-8
    indent_style = space # 缩进风格(tab | space)
    indent_size = 2 # 缩进大小
    end_of_line = lf # 控制换行类型(lf | cr | crlf)
    trim_trailing_whitespace = true # 去除行首的任意空白字符
    insert_final_newline = true # 始终在文件末尾插入一个新行
    
    [*.md] # 表示仅 md 文件适用以下规则
    max_line_length = off # 关闭最大行长度限制
    trim_trailing_whitespace = false # 关闭末尾空格修剪
  2.  .prettierrc.cjs
    // @see https://prettier.io/docs/en/options
    module.exports = {
      singleQuote: true,
      printWidth: 100,
      tabWidth: 2,
      useTabs: false,
      semi: false,
      trailingComma: 'all',
      endOfLine: 'auto',
    }
  3.  .eslintrc.cjs
    // .eslintrc.cjs 文件
    module.exports = {
      env: {
        browser: true,
        es2021: true,
        node: true,
      },
      extends: [
        'eslint:recommended',
        'plugin:@typescript-eslint/recommended',
        'plugin:vue/vue3-essential',
        // eslint-plugin-import 插件, @see https://www.npmjs.com/package/eslint-plugin-import
        'plugin:import/recommended',
        // eslint-config-airbnb-base 插件, tips: 本插件也可以替换成 eslint-config-standard
        'airbnb-base',
        // 1. 接入 prettier 的规则
        'prettier',
        'plugin:prettier/recommended',
        'vue-global-api',
      ],
      overrides: [
        {
          env: {
            node: true,
          },
          files: ['.eslintrc.{js,cjs}'],
          parserOptions: {
            sourceType: 'script',
          },
        },
      ],
      parserOptions: {
        ecmaVersion: 'latest',
        parser: '@typescript-eslint/parser',
        sourceType: 'module',
      },
      plugins: [
        '@typescript-eslint',
        'vue',
        // 2. 加入 prettier 的 eslint 插件
        'prettier',
        // eslint-import-resolver-typescript 插件,@see https://www.npmjs.com/package/eslint-import-resolver-typescript
        'import',
      ],
      rules: {
        'vue/multi-word-component-names': 'off',
        // 3. 注意要加上这一句,开启 prettier 自动修复的功能
        'prettier/prettier': 'error',
        // turn on errors for missing imports
        'import/no-unresolved': 'off',
        // 对后缀的检测,否则 import 一个ts文件也会报错,需要手动添加'.ts', 增加了下面的配置后就不用了
        'import/extensions': [
          'error',
          'ignorePackages',
          { js: 'never', jsx: 'never', ts: 'never', tsx: 'never' },
        ],
        // 只允许1个默认导出,关闭,否则不能随意export xxx
        'import/prefer-default-export': ['off'],
        'no-console': ['off'],
        // 'no-unused-vars': ['off'],
        // '@typescript-eslint/no-unused-vars': ['off'],
        // 解决vite.config.ts报错问题
        'import/no-extraneous-dependencies': 'off',
        'no-plusplus': 'off',
        'no-shadow': 'off',
      },
      // eslint-import-resolver-typescript 插件,@see https://www.npmjs.com/package/eslint-import-resolver-typescript
      settings: {
        'import/parsers': {
          '@typescript-eslint/parser': ['.ts', '.tsx'],
        },
        'import/resolver': {
          typescript: {},
        },
      },
    }
  4.  .stylelintrc.cjs
    npm add -D stylelint stylelint-config-html stylelint-config-recess-order stylelint-config-recommended-vue stylelint-config-standard stylelint-config-standard-scss postcss postcss-html postcss-scss sass
    module.exports = {
      root: true,
      extends: [
        'stylelint-config-standard',
        'stylelint-config-standard-scss', // tips: 本插件也可以替换成 stylelint-config-recommended-scss
        'stylelint-config-recommended-vue/scss',
        'stylelint-config-html/vue',
        'stylelint-config-recess-order',
      ],
      overrides: [
        // 扫描 .vue/html 文件中的<style>标签内的样式
        {
          files: ['**/*.{vue,html}'],
          customSyntax: 'postcss-html',
        },
        {
          files: ['**/*.{css,scss}'],
          customSyntax: 'postcss-scss',
        },
      ],
      // 自定义规则
      rules: {
        // 允许 global 、export 、v-deep等伪类
        'selector-pseudo-class-no-unknown': [
          true,
          {
            ignorePseudoClasses: ['global', 'export', 'v-deep', 'deep'],
          },
        ],
        'unit-no-unknown': [
          true,
          {
            ignoreUnits: ['rpx'],
          },
        ],
      },
    }

2、引入 husky + lint-staged + commitlint

  1. 先安装git   在终端输入命令  git init        
  2. npm i -D husky lint-staged commitlint @commitlint/cli @commitlint/config-conventional
  3. npx husky install
  4. 在 package.json的scripts里面增加 "prepare": "husky install"
  5. package.json  
    "lint-staged": {
      "**/*.{html,vue,ts,cjs,json,md}": [
        "prettier --write"
      ],
      "**/*.{vue,js,ts,jsx,tsx}": [
        "eslint --fix"
      ],
      "**/*.{vue,css,scss,html}": [
        "stylelint --fix"
      ]
    },
    // commitlint.config.cjs 文件
    module.exports = {
      extends: ['@commitlint/config-conventional'],
    }
    npx husky add .husky/pre-commit "npx --no-install -- lint-staged"
    npx husky add .husky/commit-msg "npx --no-install commitlint --edit $1"

 3、vite.config.ts 优化 

  1. vite.config.ts
  2. import path from 'node:path'
    import { defineConfig, loadEnv } from 'vite'
    import uni from '@dcloudio/vite-plugin-uni'
    import dayjs from 'dayjs'
    import vue from '@vitejs/plugin-vue'
    import svgLoader from 'vite-svg-loader'
    import { visualizer } from 'rollup-plugin-visualizer'
    import ViteRestart from 'vite-plugin-restart'
    import Components from 'unplugin-vue-components/vite'
    // ElementPlusResolver,
    // AntDesignVueResolver,
    // VantResolver,
    // HeadlessUiResolver,
    // ElementUiResolver
    import {} from 'unplugin-vue-components/resolvers'
    import AutoImport from 'unplugin-auto-import/vite'
    import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
    import viteCompression from 'vite-plugin-compression'
    import viteImagemin from 'vite-plugin-imagemin'
    import vueSetupExtend from 'vite-plugin-vue-setup-extend'
    import UnoCSS from 'unocss/vite'
    import autoprefixer from 'autoprefixer'
    
    const htmlPlugin = () => {
      return {
        name: 'html-transform',
        transformIndexHtml(html) {
          return html.replace('%BUILD_DATE%', dayjs().format('YYYY-MM-DD HH:mm:ss'))
        },
      }
    }
    
    // https://vitejs.dev/config/
    export default ({ mode }) => {
      // mode: 区分生产环境还是开发环境
      // process.cwd(): 获取当前文件的目录跟地址
      // loadEnv(): 返回当前环境env文件中额外定义的变量
      const env = loadEnv(mode, path.resolve(process.cwd(), 'env'))
      console.log(env)
      return defineConfig({
        plugins: [
          uni(),
          UnoCSS(),
          htmlPlugin(),
          svgLoader(),
          // 打包分析插件
          visualizer(),
          ViteRestart({
            // 通过这个插件,在修改vite.config.js文件则不需要重新运行也生效配置
            restart: ['vite.config.js'],
          }),
          vueSetupExtend(),
          // 原先引用组件的时候需要在目标文件里面import相关组件,现在就可以直接使用无需在目标文件import了
          Components({
            dirs: ['src/components'], // 目标文件夹
            extensions: ['vue'], // 文件类型
            dts: 'src/components.d.ts', // 输出文件,里面都是一些import的组件键值对
            // ui库解析器,也可以自定义,需要安装相关UI库
            resolvers: [
              // VantResolver(),
              // ElementPlusResolver(),
              // AntDesignVueResolver(),
              // HeadlessUiResolver(),
              // ElementUiResolver()
            ],
          }),
          AutoImport({
            imports: ['vue'],
            dts: 'src/auto-import.d.ts',
          }),
          createSvgIconsPlugin({
            // 指定要缓存的文件夹
            iconDirs: [path.resolve(process.cwd(), 'src/assets/svg')],
            // 指定symbolId格式
            symbolId: 'icon-[dir]-[name]',
          }),
          viteCompression(), // 会多出一些.gz文件,如xxx.js.gz,这里默认是不会删除xxx.js文件的,如果想删除也可以增加配置
          // 这个图片压缩插件比较耗时,希望仅在生产环境使用
          viteImagemin({
            gifsicle: {
              // gif图片压缩
              optimizationLevel: 3, // 选择1到3之间的优化级别
              interlaced: false, // 隔行扫描gif进行渐进式渲染
              // colors: 2 // 将每个输出GIF中不同颜色的数量减少到num或更少。数字必须介于2和256之间。
            },
            optipng: {
              // png
              optimizationLevel: 7, // 选择0到7之间的优化级别
            },
            mozjpeg: {
              // jpeg
              quality: 20, // 压缩质量,范围从0(最差)到100(最佳)。
            },
            pngquant: {
              // png
              quality: [0.8, 0.9], // Min和max是介于0(最差)到1(最佳)之间的数字,类似于JPEG。达到或超过最高质量所需的最少量的颜色。如果转换导致质量低于最低质量,图像将不会被保存。
              speed: 4, // 压缩速度,1(强力)到11(最快)
            },
            svgo: {
              // svg压缩
              plugins: [
                {
                  name: 'removeViewBox',
                },
                {
                  name: 'removeEmptyAttrs',
                  active: false,
                },
              ],
            },
          }),
        ],
        css: {
          postcss: {
            plugins: [
              autoprefixer({
                // 指定目标浏览器
                overrideBrowserslist: ['> 1%', 'last 2 versions'],
              }),
            ],
          },
        },
    
        resolve: {
          alias: {
            '@': path.join(process.cwd(), './src'),
          },
        },
        server: {
          host: '0.0.0.0',
          hmr: true,
          port: 7001,
          // 自定义代理规则
          proxy: {
            // 选项写法
            '/api': {
              target: 'http://localhost:6666',
              changeOrigin: true,
              rewrite: (path) => path.replace(/^\/api/, ''),
            },
          },
        },
      })
    }
    npm i -D vite-svg-loader rollup-plugin-visualizer vite-plugin-restart unplugin-vue-components unplugin-auto-import vite-plugin-svg-icons vite-plugin-compression vite-plugin-vue-setup-extend unocss autoprefixer

    vite-plugin-imagemin目前无法安装

  3. uno.config.ts

    // uno.config.ts
    import {
      defineConfig,
      presetAttributify,
      presetUno,
      presetIcons,
      transformerDirectives,
      transformerVariantGroup,
    } from 'unocss'
    
    export default defineConfig({
      presets: [
        presetUno(),
        // 支持css class属性化,eg: `<button bg="blue-400 hover:blue-500 dark:blue-500 dark:hover:blue-600" text="sm white">attributify Button</button>`
        presetAttributify(),
        // 支持图标,需要搭配图标库,eg: @iconify-json/carbon, 使用 `<button class="i-carbon-sun dark:i-carbon-moon" />`
        presetIcons({
          scale: 1.2,
          warn: true,
          extraProperties: {
            display: 'inline-block',
            'vertical-align': 'middle',
          },
        }),
      ],
      transformers: [
        transformerDirectives(),
        // 支持css class组合,eg: `<div class="hover:(bg-gray-400 font-medium) font-(light mono)">测试 unocss</div>`
        transformerVariantGroup(),
      ],
    })
  4. main.ts

    import 'virtual:svg-icons-register'
    import 'virtual:uno.css'
  5. tsconfig.json

    {
      "compilerOptions": {
        "sourceMap": true,
        "baseUrl": ".",
        "paths": {
          "@/*": ["./src/*"]
        },
        "lib": ["esnext", "dom"],
        "types": ["@dcloudio/types", "@types/wechat-miniprogram", "@uni-helper/uni-app-types"]
      },
      "vueCompilerOptions": {
        "nativeTags": ["block", "template", "component", "slot"]
      },
      "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
      "references": [{ "path": "./tsconfig.node.json" }]
    }
  6. .eslintrc.cjs

    globals: {
         uni: true,
    },
    npm i -D @types/wechat-miniprogram @uni-helper/uni-app-types
    npm i -S pinia pinia-plugin-persistedstate
    // src/store/index.ts
    import { createPinia } from 'pinia'
    import { createPersistedState } from 'pinia-plugin-persistedstate' // 数据持久化
    
    const store = createPinia()
    store.use(
      createPersistedState({
        storage: {
          getItem: uni.getStorageSync,
          setItem: uni.setStorageSync,
        },
      }),
    )
    export default store
    
    // src.main.ts
    import { createSSRApp } from 'vue'
    import App from './App.vue'
    import store from './store'
    import 'virtual:svg-icons-register'
    import 'virtual:uno.css'
    
    export function createApp() {
      const app = createSSRApp(App)
      app.use(store)
      return {
        app,
      }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1901067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux Centos7部署Zookeeper

目录 一、下载zookeeper 二、单机部署 1、创建目录 2、解压 3、修改配置文件名 ​4、创建保存数据的文件夹 ​5、修改配置文件保存数据的地址 ​6、启动服务 7、api创建节点 一、下载zookeeper 地址&#xff1a;Index of /dist/zookeeper/zookeeper-3.5.7 (apache.org…

在5G/6G应用中实现高性能放大器的建模挑战

来源&#xff1a;Modelling Challenges for Enabling High Performance Amplifiers in 5G/6G Applications {第28届“集成电路和系统的混合设计”(Mixed Design of Integrated Circuits and Systems)国际会议论文集&#xff0c;2021年6月24日至26日&#xff0c;波兰洛迪} 本文讨…

Stream 很好,Map 很酷,但答应我别用 toMap()

文章目录 Collectors.toMap() 的常见问题替代方案1. 使用 Collectors.groupingBy()2. 处理空值3. 自定义合并逻辑 总结 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博…

键盘异常的检测与解决方案

今天对象用Word写文档&#xff0c;按下Ctrl的时候&#xff0c;页面不停地上下滑动&#xff0c;导致无法正常编辑文本。 重启之后&#xff0c;仍然无法解决&#xff0c;推断是键盘坏了。 但是当按下Fn或其他功能键&#xff0c;焦点移除&#xff0c;页面就不会再抖动了。 现在…

2.2.2.1 如何在vscode 中设置ROS2的 用户代码片段

1. vscode中设置C版本的ROS2用户代码片段 1) 找到vscode 下的设置选项&#xff0c;选择用户代码片段 2) 选择用户代码片段后&#xff0c;会弹出选择框&#xff0c;如下图&#xff0c;输入C,选择 cpp.json 配置好的文件 进入如下文件&#xff0c;下图为本人配置的代码片段模版文…

E1.【C语言】练习:用函数求两个整数的较大值

有关创建函数见&#xff1a; 12.【C语言】创建函数 写法 1&#xff1a;if语句 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int max(int a, int b) {if (a > b)return a;elsereturn b; } int main() {int a 0;int b 0;scanf("%d%d", &a,…

数据可视化之智慧城市的脉动与洞察

在数字化转型的浪潮中,城市作为社会经济发展的核心单元,正经历着前所未有的变革。城市数据可视化大屏看板作为这一变革中的重要工具,不仅极大地提升了城市管理效率,还为公众提供了直观、全面的城市运行状态视图,成为智慧城市建设不可或缺的一部分。本文将深入探讨以“城市…

【MySQL04】【 redo 日志】

文章目录 一、前言二、redo 日志1. redo 日志格式2. Mini-Transaction2.1 以组的形式写入 redo 日志2.2 Mini-Transaction &#xff08;MTR&#xff09;概念 3. redo 日志写入过程3.1 redo 日志缓冲区3.3 redo 日志写入 log buffer 4. redo 日志文件4.1 redo 日志刷盘机制4.2 r…

实现桌面动态壁纸(二)

目录 前言 一、关于 WorkerW 工作区窗口 二、关于窗口关系 2.1 窗口以及窗口隶属关系 2.2 桌面管理层窗口组分简析 2.3 厘清两个概念的区别 2.4 关于设置父窗口 三、编写代码以供在 Vista 上实现 3.1 方法二&#xff1a;子类化并自绘窗口背景 四、初步分析桌面管理层…

qt 如何添加子项目

首先我们正常流程创建一个项目文件&#xff1a; 这是我已经创建好的&#xff0c;请无视红线 然后找到该项目的文件夹&#xff0c;在文件夹下创建一个文件夹&#xff0c;再到创建好的文件夹下面创建一个 .pri 文件&#xff1a; &#xff08;创建文件夹&#xff09; &#xff08…

自闭症在生活中的典型表现

自闭症&#xff0c;这个看似遥远却又悄然存在于我们周围的疾病&#xff0c;其影响深远且复杂。在日常生活中&#xff0c;自闭症患者的典型表现往往让人印象深刻&#xff0c;这些表现不仅揭示了他们内心的世界&#xff0c;也提醒我们要以更加包容和理解的心态去面对他们。 首先…

嵌入式C语言面试相关知识——关键字(不定期更新)

嵌入式C语言面试相关知识——关键字 一、博客声明二、C语言关键字1、sizeof关键字2、static关键字3、const关键字4、volatile关键字5、extern关键字 一、博客声明 又是一年一度的秋招&#xff0c;怎么能只刷笔试题目呢&#xff0c;面试题目也得看&#xff0c;想当好厂的牛马其实…

六、快速启动框架:SpringBoot3实战-个人版

六、快速启动框架&#xff1a;SpringBoot3实战 文章目录 六、快速启动框架&#xff1a;SpringBoot3实战一、SpringBoot3介绍1.1 SpringBoot3简介1.2 系统要求1.3 快速入门1.4 入门总结回顾复习 二、SpringBoot3配置文件2.1 统一配置管理概述2.2 属性配置文件使用2.3 YAML配置文…

前端面试题8

基础知识 解释一下什么是跨域问题&#xff0c;以及如何解决&#xff1f; 跨域问题是由于浏览器的同源策略限制了从一个源加载的网页脚本访问另一个源的数据。解决方法包括使用JSONP、CORS&#xff08;跨源资源共享&#xff09;、设置代理服务器等。 描述一下事件冒泡和事件捕获…

kubernetes集群部署:node节点部署和cri-docker运行时安装(四)

安装前准备 同《kubernetes集群部署&#xff1a;环境准备及master节点部署&#xff08;二&#xff09;》 安装cri-docker 在 Kubernetes 1.20 版本之前&#xff0c;Docker 是 Kubernetes 默认的容器运行时。然而&#xff0c;Kubernetes 社区决定在 Kubernetes 1.20 及以后的…

Spring中的事件监听器使用学习

一、什么是Spring中的事件监听机制&#xff1f; Spring框架中的事件监听机制是一种设计模式&#xff0c;它允许你定义和触发事件&#xff0c;同时允许其他组件监听这些事件并在事件发生时作出响应。这种机制基于观察者模式&#xff0c;提供了一种松耦合的方式来实现组件间的通信…

自动缩放 win7 远程桌面

https://mremoteng.org/download 用这个软件&#xff0c;下载 zip 版&#xff0c;不需要管理员权限 在这里找到的&#xff0c;选票最高的一个就是 https://superuser.com/questions/1030041/remote-desktop-zoom-and-full-screen-how-win10-remote-win7-2008-2003-ho

蓝桥杯开发板STM32G431RBT6高阶HAL库学习FreeRtos——认识HAL_Delay和osDelay的区别

一、修改两个任务的优先级 任务一 任务二 二、使用HAL_Delay的实验结果 结果&#xff1a; LED1亮&#xff0c;LED2不亮 三、使用osDelay的实验结果 结果&#xff1a; LED1亮&#xff0c;LED2亮 四、解释原因 vTaskDelay 与 HAL_Delay 的区别 1.vTaskDelay 作用是让任务阻…

基于RK3588的8路摄像头实时全景拼接

基于RK3588的8路摄像头实时全景拼接 输入&#xff1a;2路csi转8路mpi的ahd摄像头&#xff0c;分辨率1920 * 1080 8路拼接结果&#xff1a; 6路拼接结果&#xff1a; UI界面&#xff1a; UI节目设计原理

Python爬虫获取视频

验证电脑是否安装python 1.winr输入cmd 2.在黑窗口输入 python.exe 3.不是命令不存在就说明python环境安装完成 抓取快手视频 1.在phcharm应用中新建一个项目 3.新建一个python文件 4.选择python文件,随便起一个名字后按回车 5.安装requests pip install requests 6.寻找需要的…