# happy-study **Repository Path**: someFutures/happy-study ## Basic Information - **Project Name**: happy-study - **Description**: vite2.0+vue3.0+ts - **Primary Language**: JavaScript - **License**: EUPL-1.2 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-05-07 - **Last Updated**: 2022-04-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目简介 一个vite + vue3.0 + ts 项目 # 项目生成 1. `yarn create @vitejs/app project-name --template vue-ts` 2. ```s cd project-name npm install npm run dev ``` 3. 配置别名 ```js // 修改你的vite.config.ts 文件 import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' // node模块会在ts中报错,可执行 npm install --save-dev @types/node 解决 const {resolve} = require('path') // https://vitejs.dev/config/参考 export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': resolve(__dirname, 'src'), // 新增别名 } } }) ``` 4. 配置省略的拓展名列表,`esolve.extensions`默认为:`['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json']`,本来想配置.vue 的,但是文档说不推荐。所以算了 5. 增加scss预处理器, 直接执行`npm install sass --save-dev` 6. 设置scss全局变量, 在src目录下新建styles目录,目录下新建variables.scss文件,在文件中配置需要的全局变量,然后在vite.config.ts中增加如下配置: ```js export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': resolve(__dirname, 'src'), // 新增别名 } }, // 新增 css: { preprocessorOptions: { scss: { additionalData: `@import "./src/styles/variables";` } } } }) ``` 7. 设置直接导入json数据,在tsconfig.json的compilerOptions中添加 `"resolveJsonModule": true`;或者在shims-vue.d.ts中添加如下代码 ```js declare module "*.json" { const value: any; export default value; } ``` # 其它配置 ## 增加代码格式化 1. 执行: `npm install --save-dev @typescript-eslint/eslint-plugin @typescript-eslint/parser @vue/eslint-config-typescript @vuedx/typescript-plugin-vue eslint eslint-config-prettier eslint-plugin-prettier vue-eslint-parser` 2. 增加.eslintignore 文件,添加一些不需要检测的文件例如: ```s build/*.js src/assets public dist *.html ``` 3. 增加.eslintrc.js 文件,配置如下: ```js module.exports = { 'root': true, 'env': { 'browser': true, 'node': true, 'es6': true }, 'extends': [ 'plugin:vue/vue3-essential', 'eslint:recommended', '@vue/typescript/recommended' ], 'parser': 'vue-eslint-parser', 'parserOptions': { 'parser': '@typescript-eslint/parser', 'ecmaVersion': 2020, 'sourceType': 'module', 'ecmaFeatures': { 'jsx': true, 'modules': true } }, 'rules': { // 一些推荐的规则,可以凭自己的喜好设置 // 设置 typescript-eslint 规则 // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin/docs/rules '@typescript-eslint/no-non-null-assertion': 0, // 允许非空断言运算符 '@typescript-eslint/member-delimiter-style': [ 2, { multiline: { delimiter: 'none', requireLast: true }, singleline: { delimiter: 'semi', requireLast: false } } ], '@typescript-eslint/no-unused-vars': [0, { args: 'none', vars: 'all' }], '@typescript-eslint/interface-name-prefix': 0, '@typescript-eslint/explicit-function-return-type': 0, '@typescript-eslint/no-empty-function': 0, '@typescript-eslint/no-var-requires': 0, '@typescript-eslint/no-use-before-define': 0, // "vue/max-attributes-per-line": [2, { // "singleline": 3, // "multiline": { // "max": 1, // "allowFirstLine": false // } // }], 'vue/singleline-html-element-content-newline': 'off', 'vue/multiline-html-element-content-newline': 'off', 'vue/name-property-casing': ['error', 'PascalCase'], 'vue/no-v-html': 'off', 'accessor-pairs': 2, 'arrow-spacing': [2, { 'before': true, 'after': true }], 'block-spacing': [2, 'always'], 'brace-style': [2, '1tbs', { 'allowSingleLine': true }], 'camelcase': [0, { 'properties': 'always' }], 'comma-dangle': [2, 'never'], 'comma-spacing': [2, { 'before': false, 'after': true }], 'comma-style': [2, 'last'], 'constructor-super': 2, 'curly': [2, 'multi-line'], 'dot-location': [2, 'property'], 'eol-last': 2, 'eqeqeq': ['error', 'always', { 'null': 'ignore' }], 'generator-star-spacing': [2, { 'before': true, 'after': true }], 'handle-callback-err': [2, '^(err|error)$'], 'indent': [2, 2, { 'SwitchCase': 1 }], 'jsx-quotes': [2, 'prefer-single'], 'key-spacing': [2, { 'beforeColon': false, 'afterColon': true }], 'keyword-spacing': [2, { 'before': true, 'after': true }], 'new-cap': [2, { 'newIsCap': true, 'capIsNew': false }], 'new-parens': 2, 'no-array-constructor': 2, 'no-caller': 2, 'no-console': 'off', 'no-class-assign': 2, 'no-cond-assign': 2, 'no-const-assign': 2, 'no-control-regex': 0, 'no-delete-var': 2, 'no-dupe-args': 2, 'no-dupe-class-members': 2, 'no-dupe-keys': 2, 'no-duplicate-case': 2, 'no-empty-character-class': 2, 'no-empty-pattern': 2, 'no-eval': 2, 'no-ex-assign': 2, 'no-extend-native': 2, 'no-extra-bind': 2, 'no-extra-boolean-cast': 2, 'no-extra-parens': [2, 'functions'], 'no-fallthrough': 2, 'no-floating-decimal': 2, 'no-func-assign': 2, 'no-implied-eval': 2, 'no-inner-declarations': [2, 'functions'], 'no-invalid-regexp': 2, 'no-irregular-whitespace': 2, 'no-iterator': 2, 'no-label-var': 2, 'no-labels': [2, { 'allowLoop': false, 'allowSwitch': false }], 'no-lone-blocks': 2, 'no-mixed-spaces-and-tabs': 2, 'no-multi-spaces': 2, 'no-multi-str': 2, 'no-multiple-empty-lines': [2, { 'max': 1 }], 'no-native-reassign': 2, 'no-negated-in-lhs': 2, 'no-new-object': 2, 'no-new-require': 2, 'no-new-symbol': 2, 'no-new-wrappers': 2, 'no-obj-calls': 2, 'no-octal': 2, 'no-octal-escape': 2, 'no-path-concat': 2, 'no-proto': 2, 'no-redeclare': 2, 'no-regex-spaces': 2, 'no-return-assign': [2, 'except-parens'], 'no-self-assign': 2, 'no-self-compare': 2, 'no-sequences': 2, 'no-shadow-restricted-names': 2, 'no-spaced-func': 2, 'no-sparse-arrays': 2, 'no-this-before-super': 2, 'no-throw-literal': 2, 'no-trailing-spaces': 2, 'no-undef': 2, 'no-undef-init': 2, 'no-unexpected-multiline': 2, 'no-unmodified-loop-condition': 2, 'no-unneeded-ternary': [2, { 'defaultAssignment': false }], 'no-unreachable': 2, 'no-unsafe-finally': 2, // 在ts项目中可以关闭错误提示 'no-unused-vars': [0, { 'vars': 'all', 'args': 'none' }], 'no-useless-call': 2, 'no-useless-computed-key': 2, 'no-useless-constructor': 2, 'no-useless-escape': 0, 'no-whitespace-before-property': 2, 'no-with': 2, 'one-var': [2, { 'initialized': 'never' }], 'operator-linebreak': [2, 'after', { 'overrides': { '?': 'before', ':': 'before' } }], 'padded-blocks': [2, 'never'], 'quotes': [2, 'single', { 'avoidEscape': true, 'allowTemplateLiterals': true }], 'semi': [2, 'never'], 'semi-spacing': [2, { 'before': false, 'after': true }], 'space-before-blocks': [2, 'always'], 'space-before-function-paren': [2, 'never'], 'space-in-parens': [2, 'never'], 'space-infix-ops': 2, 'space-unary-ops': [2, { 'words': true, 'nonwords': false }], 'spaced-comment': [2, 'always', { 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] }], 'template-curly-spacing': [2, 'never'], 'use-isnan': 2, 'valid-typeof': 2, 'wrap-iife': [2, 'any'], 'yield-star-spacing': [2, 'both'], 'yoda': [2, 'never'], 'prefer-const': 2, 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, 'object-curly-spacing': [2, 'always', { objectsInObjects: false }], 'array-bracket-spacing': [2, 'never'] } } ``` 4. 发现这样不能自动格式化html,所以继续执行:`npm i --save-dev eslint-plugin-vue`, 并且在eslintrc.js中添加如下配置: ```js module.exports = { extends: [ // add more generic rulesets here, such as: // 'eslint:recommended', 'plugin:vue/vue3-recommended', //添加这行 // 'plugin:vue/recommended' // Use this if you are using Vue.js 2.x. ], rules: { // override/add rules settings here, such as: // 'vue/no-unused-vars': 'error' } } ``` 好了,这样子就完成全部的代码格式化配置了 ## 增加postcss 增加的配置比较简单,所以直接省略了。需要更多配置的同学可以查看[这里](https://github.com/postcss/postcss-load-config) ## 增加vue-router, vuex ## 增加vite 生产构建配置 ```js build: { assetsDir: 'assets', rollupOptions: { output: { // eslint-disable-next-line @typescript-eslint/no-explicit-any chunkFileNames: (chunkInfo: any) => { const facadeModuleId = chunkInfo.facadeModuleId ? chunkInfo.facadeModuleId.split('/') : [] const fileName = facadeModuleId[facadeModuleId.length - 2] || '[name]' return `js/${fileName}/[name].[hash].js` }, manualChunks(id) { if (id.includes('node_modules') && id.includes('prime')) { return 'prime' } else if (id.includes('node_modules') && id.includes('vue')) { return 'vue' } else if (id.includes('node_modules')) { return 'vendor' } } } } } ```