项目基础配置
概要
提示:换台电脑之后环境都没了,找之前的又很麻烦,所以在这块记录下
技术细节
1. vs code中settings.json配置
提示:下载相应的插件
推荐的插件
人工智能
GitHub Copilot Chat、GitHub Copilot、Codeium: AI Coding Autocomplete and Chat for Python, Javascript, Typescript, Java, Go, and more
必装插件
GitLens — Git supercharged、Git History、ESLint、console helper、Stylelint、var-translate-en
vue系列
Vuter、Vue - Official、Vue 3 Snippets、vue-helper
uniapp系列
uniapp-snippet
效率神器
vscode-styled-components、Prettier - Code formatter、Prettier ESLint、path-alias、Path Intellisense、JavaScript (ES6) code snippets、Import Cost、Image preview、EditorConfig for VS Code、 Code Translate、Auto Rename Tag、Auto Import、Auto Close Tag
javascript
{
"editor.suggestSelection": "first",
"vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
"files.associations": {
"*.cjson": "jsonc",
"*.wxss": "css",
"*.wxs": "javascript"
},
"emmet.includeLanguages": {
"wxml": "html"
},
"minapp-vscode.disableAutoConfig": true,
"editor.tabSize": 2,
// #每次保存的时候自动格式化
// "editor.formatOnSave": true,
// 配置 eslint 检查的文件类型
// "eslint.autoFixOnSave": true,
"eslint.validate": [
// "javascript", {
// "language": "vue",
// "autoFix": true
// },
// "javascriptreact",
"javascript",
"html",
"vue"
],
// 关闭编辑器内置样式检查(避免与stylelint冲突)
// "css.validate": false,
// "less.validate": false,
// "scss.validate": false,
// 配置stylelint检查的文件类型范围
"stylelint.validate": ["css", "less", "postcss", "scss", "sass", "vue"],
// 配置 stylelint 自动修复 ,VScode需要安装stylelint-plus插件,否则不能实现自动修复
"stylelint.autoFixOnSave": true,
"editor.fontSize": 14,
"javascript.updateImportsOnFileMove.enabled": "always",
"workbench.colorTheme": "Default Dark+",
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[vue]": {
"editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit"
},
"tabnine.experimentalAutoImports": true,
"settingsSync.ignoredExtensions": [],
"diffEditor.ignoreTrimWhitespace": false,
"consoleLog.Font Size": "14",
"settingsSync.ignoredSettings": [],
"liveServer.settings.AdvanceCustomBrowserCmdLine": "",
"editor.fontLigatures": false,
"github.copilot.enable": {
"*": true,
"plaintext": false,
"markdown": false,
"scminput": false
},
"editor.inlayHints.enabled": "offUnlessPressed",
"files.autoSave": "afterDelay",
"security.workspace.trust.untrustedFiles": "open",
}
javascript
{
"editor.suggestSelection": "first",
"vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
"files.associations": {
"*.cjson": "jsonc",
"*.wxss": "css",
"*.wxs": "javascript"
},
"emmet.includeLanguages": {
"wxml": "html"
},
"minapp-vscode.disableAutoConfig": true,
"editor.tabSize": 2,
// 配置 eslint 检查的文件类型
"eslint.autoFixOnSave": true,
"eslint.validate": [
"javascript", {
"language": "vue",
"autoFix": true
},
"html",
"vue"
],
// stylelint 需要检查的文件
"stylelint.validate": [
"css",
"less",
"postcss",
"scss",
"vue",
"sass"
],
// 配置 stylelint 自动修复 ,VScode需要安装stylelint-plus插件,否则不能实现自动修复
"stylelint.autoFixOnSave": true,
"editor.fontSize": 14,
"javascript.updateImportsOnFileMove.enabled": "always",
"[html]": {
"editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[vue]": {
"editor.defaultFormatter": "stylelint.vscode-stylelint"
},
"tabnine.experimentalAutoImports": true,
"[css]": {
"editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
},
"editor.codeActionsOnSave": {
"source.fixAll.stylelint": "explicit",
"source.fixAll.eslint": "explicit"
},
"liveServer.settings.AdvanceCustomBrowserCmdLine": "",
"editor.fontLigatures": false,
"editor.inlineSuggest.enabled": true,
"workbench.colorTheme": "Default Dark+",
"vue.autoInsert.dotValue": true,
"github.copilot.enable": {
"*": true,
"plaintext": false,
"markdown": false,
"scminput": false,
"vue": true
},
"window.commandCenter": true,
"extensions.autoCheckUpdates": false,
"files.autoSave": "afterDelay",
"json.schemas": [
],
"eslint.format.enable": true,
"editor.stickyScroll.enabled": false
}
2. vue3 好的Eslint配置
javascript
module.exports = {
'root': true,
'env': {
'browser': true,
'commonjs': true,
'es6': true
},
'extends': [
'plugin:vue/base'
],
'parserOptions': {
'ecmaVersion': 2017,
'sourceType': 'module'
},
'plugins': [
'vue'
],
'rules': {
// 花括号中间间距一个空格
'vue/mustache-interpolation-spacing': ['error', 'always'],
// 不允许多个空格
'vue/no-multi-spaces': ['error', {
'ignoreProperties': false
}],
// 属性顺序
'vue/attributes-order': ['error', {
'order': [
'DEFINITION',
'LIST_RENDERING',
'CONDITIONALS',
'RENDER_MODIFIERS',
'GLOBAL',
'UNIQUE',
'TWO_WAY_BINDING',
'OTHER_DIRECTIVES',
'OTHER_ATTR',
'EVENTS',
'CONTENT'
],
'alphabetical': false
}],
// 标签属性-连接
'vue/attribute-hyphenation': ['error', 'never'],
'vue/html-closing-bracket-spacing': ['error', {
'startTag': 'never',
'endTag': 'never',
'selfClosingTag': 'always'
}],
'vue/html-indent': ['error', 2, {
'attribute': 1,
'baseIndent': 1,
'closeBracket': 0,
'alignAttributesVertically': true,
'ignores': []
}],
'vue/html-quotes': ['error', 'double', { 'avoidEscape': true }],
'vue/html-self-closing': ['error', {
'html': {
'void': 'never',
'normal': 'always',
'component': 'always'
},
'svg': 'always',
'math': 'always'
}],
// 在computed properties中禁用异步actions
'vue/no-async-in-computed-properties': 'error',
// 不允许重复的keys
'vue/no-dupe-keys': 'error',
// 不允许重复的attributes
'vue/no-duplicate-attributes': 'warn',
'comma-spacing': ['error', { 'before': false, 'after': true }],
// 在 <template> 标签下不允许解析错误
'vue/no-parsing-error': ['error', {
'x-invalid-end-tag': false,
}],
// 不允许覆盖保留关键字
'vue/no-reserved-keys': 'error',
// 强制data必须是一个带返回值的函数
// 'vue/no-shared-component-data': 'error',
// 不允许在computed properties中出现副作用。
'vue/no-side-effects-in-computed-properties': 'error',
// <template>不允许key属性
'vue/no-template-key': 'warn',
// 在 <textarea> 中不允许mustaches
'vue/no-textarea-mustache': 'error',
// 不允许在v-for或者范围内的属性出现未使用的变量定义
'vue/no-unused-vars': 'warn',
// <component>标签需要v-bind:is属性
'vue/require-component-is': 'error',
// render 函数必须有一个返回值
'vue/require-render-return': 'error',
// 保证 v-bind:key 和 v-for 指令成对出现
'vue/require-v-for-key': 'error',
// 检查默认的prop值是否有效
'vue/require-valid-default-prop': 'error',
// 保证computed属性中有return语句
'vue/return-in-computed-property': 'error',
// 强制校验 template 根节点
'vue/valid-template-root': 'error',
// 强制校验 v-bind 指令
'vue/valid-v-bind': 'error',
// 强制校验 v-cloak 指令
'vue/valid-v-cloak': 'error',
// 强制校验 v-else-if 指令
'vue/valid-v-else-if': 'error',
// 强制校验 v-else 指令
'vue/valid-v-else': 'error',
// 强制校验 v-for 指令
'vue/valid-v-for': 'error',
// 强制校验 v-html 指令
'vue/valid-v-html': 'error',
// 强制校验 v-if 指令
'vue/valid-v-if': 'error',
// 强制校验 v-model 指令
'vue/valid-v-model': 'error',
// 强制校验 v-on 指令
'vue/valid-v-on': 'error',
// 强制校验 v-once 指令
'vue/valid-v-once': 'error',
// 强制校验 v-pre 指令
'vue/valid-v-pre': 'error',
// 强制校验 v-show 指令
'vue/valid-v-show': 'error',
// 强制校验 v-text 指令
'vue/valid-v-text': 'error',
'vue/comment-directive': 0,
// 空行最多不能超过2行
'no-multiple-empty-lines': [1, {
'max': 1
}],
'object-curly-spacing': ['error', 'always'],
'no-cond-assign': 'error', // 禁止条件表达式中出现赋值操作符
'no-constant-condition': 'error', // 禁止在条件中使用常量表达式
'no-multi-spaces': 'error',
'no-dupe-args': 'error', // 禁止 function 定义中出现重名参数
'no-duplicate-case': 'error', // 禁止出现重复的 case 标签
'no-empty': 'error', // 禁止出现空语句块
'no-irregular-whitespace': 'error', // 禁止不规则的空白
'array-bracket-spacing': ['error', 'never'], // 禁止或强制在括号内使用空格
'no-alert': 'error', // 禁止alert,conirm等
'no-debugger': 'error', // 禁止debugger
'semi': ['error', 'never'], // 禁止分号
'no-unreachable': 'error', // 当有不能执行到的代码时
'eol-last': 'error', // 文件末尾强制换行
'no-new': 'error', // 禁止在使用new构造一个实例后不赋值
'quotes': ['error', 'single'], // 引号类型 `` "" ''
'no-unused-vars': ['error', { 'vars': 'all', 'args': 'after-used' }], // 不能有声明后未被使用的变量
'no-trailing-spaces': 'error', // 一行结束后面不要有空格
'space-before-function-paren': ['error', 'never'], // 函数定义时括号前面要不要有空格
'generator-star-spacing': 'error', // allow async-await
'space-before-function-paren': ['error', 'never'], // 禁止函数名前有空格,如function Test (aaa,bbb)
'space-in-parens': ['error', 'never'], // 禁止圆括号有空格,如Test( 2, 3 )
'space-infix-ops': 'error', // 在操作符旁边必须有空格, 如 a + b而不是a+b
'space-before-blocks': ['error', 'always'], // 语句块之前必须有空格 如 ) {}
'spaced-comment': ['error', 'always'], // 注释前必须有空格
'arrow-body-style': ['error', 'always'], // 要求箭头函数必须有大括号 如 a => {}
'arrow-spacing': ['error', { 'before': true, 'after': true }], // 定义箭头函数的箭头前后都必须有空格
'no-const-assign': 'error', // 禁止修改const变量
'template-curly-spacing': ['error', 'never'], // 禁止末班字符串中的{}中的变量出现空格,如以下错误`${ a }`
'no-multi-spaces': 'error', // 禁止多个空格,只有一个空格的地方必须只有一个
'no-whitespace-before-property': 'error', // 禁止属性前有空格,如obj. a
'keyword-spacing': ['error', { 'before': true, 'after': true }] // 关键字前后必须有空格 如 } else {
}
}
3. vue3 styleLint配置
javascript
module.exports = {
"extends": ["stylelint-config-standard", "stylelint-config-standard-wxss", "stylelint-config-recommended-wxss"],
"plugins": ["stylelint-scss", "stylelint-order"],
"rules": {
// 指定声明块内属性的字母顺序
'order/properties-order': [
'position',
'top',
'right',
'bottom',
'left',
'z-index',
'display',
'float',
'width',
'height',
'max-width',
'max-height',
'min-width',
'min-height',
'padding',
'padding-top',
'padding-right',
'padding-bottom',
'padding-left',
'margin',
'margin-top',
'margin-right',
'margin-bottom',
'margin-left',
'margin-collapse',
'margin-top-collapse',
'margin-right-collapse',
'margin-bottom-collapse',
'margin-left-collapse',
'overflow',
'overflow-x',
'overflow-y',
'clip',
'clear',
'font',
'font-family',
'font-size',
'font-smoothing',
'osx-font-smoothing',
'font-style',
'font-weight',
'hyphens',
'src',
'line-height',
'letter-spacing',
'word-spacing',
'color',
'text-align',
'text-decoration',
'text-indent',
'text-overflow',
'text-rendering',
'text-size-adjust',
'text-shadow',
'text-transform',
'word-break',
'word-wrap',
'white-space',
'vertical-align',
'list-style',
'list-style-type',
'list-style-position',
'list-style-image',
'pointer-events',
'cursor',
'background',
'background-attachment',
'background-color',
'background-image',
'background-position',
'background-repeat',
'background-size',
'border',
'border-collapse',
'border-top',
'border-right',
'border-bottom',
'border-left',
'border-color',
'border-image',
'border-top-color',
'border-right-color',
'border-bottom-color',
'border-left-color',
'border-spacing',
'border-style',
'border-top-style',
'border-right-style',
'border-bottom-style',
'border-left-style',
'border-width',
'border-top-width',
'border-right-width',
'border-bottom-width',
'border-left-width',
'border-radius',
'border-top-right-radius',
'border-bottom-right-radius',
'border-bottom-left-radius',
'border-top-left-radius',
'border-radius-topright',
'border-radius-bottomright',
'border-radius-bottomleft',
'border-radius-topleft',
'content',
'quotes',
'outline',
'outline-offset',
'opacity',
'filter',
'visibility',
'size',
'zoom',
'transform',
'box-align',
'box-flex',
'box-orient',
'box-pack',
'box-shadow',
'box-sizing',
'table-layout',
'animation',
'animation-delay',
'animation-duration',
'animation-iteration-count',
'animation-name',
'animation-play-state',
'animation-timing-function',
'animation-fill-mode',
'transition',
'transition-delay',
'transition-duration',
'transition-property',
'transition-timing-function',
'background-clip',
'backface-visibility',
'resize',
'appearance',
'user-select',
'interpolation-mode',
'direction',
'marks',
'page',
'set-link-source',
'unicode-bidi',
'speak',
],
"selector-pseudo-class-no-unknown": [true,
{
"ignorePseudoClasses": ["deep"]
}
],
// 颜色值要小写
'color-hex-case': 'lower', 'number-leading-zero': 'always',
}
}
4. vue2 Eslint配置
vue2 Eslint配置
javascript
module.exports = {
"root": true,
"env": {
"browser": true,
"commonjs": true,
"es6": true
},
"extends": [
"plugin:vue/base"
],
"parserOptions": {
"ecmaVersion": 2017,
"sourceType": "module"
},
"plugins": [
"vue"
],
"rules": {
// 花括号中间间距一个空格
'vue/mustache-interpolation-spacing': ["error", "always"],
// 不允许多个空格
'vue/no-multi-spaces': ['error', {
"ignoreProperties": false
}],
// 属性顺序
'vue/attributes-order': ['error', {
'order': [
"DEFINITION",
"LIST_RENDERING",
"CONDITIONALS",
"RENDER_MODIFIERS",
"GLOBAL",
"UNIQUE",
"TWO_WAY_BINDING",
"OTHER_DIRECTIVES",
"OTHER_ATTR",
"EVENTS",
"CONTENT"
],
'alphabetical': false
}],
// 标签属性-连接
'vue/attribute-hyphenation': ['error', 'never'],
'vue/html-closing-bracket-spacing': ['error', {
'startTag': 'never',
'endTag': 'never',
'selfClosingTag': 'always'
}],
'vue/html-indent': ['error', 2, {
"attribute": 1,
"baseIndent": 1,
"closeBracket": 0,
"alignAttributesVertically": true,
"ignores": []
}],
'vue/html-quotes': ["error", "double", { "avoidEscape": true }],
'vue/html-self-closing': ['error', {
"html": {
"void": "never",
"normal": "always",
"component": "always"
},
"svg": "always",
"math": "always"
}],
// 在computed properties中禁用异步actions
'vue/no-async-in-computed-properties': 'error',
// 不允许重复的keys
'vue/no-dupe-keys': 'error',
// 不允许重复的attributes
'vue/no-duplicate-attributes': 'warn',
'comma-spacing': ['error', { "before": false, "after": true }],
// 在 <template> 标签下不允许解析错误
'vue/no-parsing-error': ['error',{
'x-invalid-end-tag': false,
}],
// 不允许覆盖保留关键字
'vue/no-reserved-keys': 'error',
// 强制data必须是一个带返回值的函数
// 'vue/no-shared-component-data': 'error',
// 不允许在computed properties中出现副作用。
'vue/no-side-effects-in-computed-properties': 'error',
// <template>不允许key属性
'vue/no-template-key': 'warn',
// 在 <textarea> 中不允许mustaches
'vue/no-textarea-mustache': 'error',
// 不允许在v-for或者范围内的属性出现未使用的变量定义
'vue/no-unused-vars': 'warn',
// <component>标签需要v-bind:is属性
'vue/require-component-is': 'error',
// render 函数必须有一个返回值
'vue/require-render-return': 'error',
// 保证 v-bind:key 和 v-for 指令成对出现
'vue/require-v-for-key': 'error',
// 检查默认的prop值是否有效
'vue/require-valid-default-prop': 'error',
// 保证computed属性中有return语句
'vue/return-in-computed-property': 'error',
// 强制校验 template 根节点
'vue/valid-template-root': 'error',
// 强制校验 v-bind 指令
'vue/valid-v-bind': 'error',
// 强制校验 v-cloak 指令
'vue/valid-v-cloak': 'error',
// 强制校验 v-else-if 指令
'vue/valid-v-else-if': 'error',
// 强制校验 v-else 指令
'vue/valid-v-else': 'error',
// 强制校验 v-for 指令
'vue/valid-v-for': 'error',
// 强制校验 v-html 指令
'vue/valid-v-html': 'error',
// 强制校验 v-if 指令
'vue/valid-v-if': 'error',
// 强制校验 v-model 指令
'vue/valid-v-model': 'error',
// 强制校验 v-on 指令
'vue/valid-v-on': 'error',
// 强制校验 v-once 指令
'vue/valid-v-once': 'error',
// 强制校验 v-pre 指令
'vue/valid-v-pre': 'error',
// 强制校验 v-show 指令
'vue/valid-v-show': 'error',
// 强制校验 v-text 指令
'vue/valid-v-text': 'error',
'vue/comment-directive': 0,
// 空行最多不能超过2行
"no-multiple-empty-lines": [1, {
"max": 1
}],
'object-curly-spacing': ["error", "always"],
"no-cond-assign": "error", // 禁止条件表达式中出现赋值操作符
"no-constant-condition": "error", // 禁止在条件中使用常量表达式
"no-multi-spaces": "error",
"no-dupe-args": "error", // 禁止 function 定义中出现重名参数
"no-duplicate-case": "error", // 禁止出现重复的 case 标签
"no-empty": "error", // 禁止出现空语句块
"no-irregular-whitespace": "error", // 禁止不规则的空白
"array-bracket-spacing": ["error", "never"], // 禁止或强制在括号内使用空格
"no-alert": "error", // 禁止alert,conirm等
"no-debugger": "error", // 禁止debugger
"semi": ["error", "never"], // 禁止分号
"no-unreachable": "error", // 当有不能执行到的代码时
"eol-last": "error", // 文件末尾强制换行
"no-new": "error", // 禁止在使用new构造一个实例后不赋值
"quotes": ["error", "single"], // 引号类型 `` "" ''
"no-unused-vars": ["error", { "vars": "all", "args": "after-used" }], // 不能有声明后未被使用的变量
"no-trailing-spaces": "error", // 一行结束后面不要有空格
"space-before-function-paren": ["error", "never"], // 函数定义时括号前面要不要有空格
'generator-star-spacing': "error", // allow async-await
"space-before-function-paren": ["error", "never"], // 禁止函数名前有空格,如function Test (aaa,bbb)
"space-in-parens": ["error", "never"], // 禁止圆括号有空格,如Test( 2, 3 )
"space-infix-ops": "error", // 在操作符旁边必须有空格, 如 a + b而不是a+b
"space-before-blocks": ["error", "always"], // 语句块之前必须有空格 如 ) {}
"spaced-comment":["error", "always"], // 注释前必须有空格
"arrow-body-style": ["error", "always"], // 要求箭头函数必须有大括号 如 a => {}
"arrow-spacing": ["error", { "before": true, "after": true }], // 定义箭头函数的箭头前后都必须有空格
"no-const-assign": "error", // 禁止修改const变量
"template-curly-spacing": ["error", "never"], // 禁止末班字符串中的{}中的变量出现空格,如以下错误`${ a }`
"no-multi-spaces": "error", // 禁止多个空格,只有一个空格的地方必须只有一个
"no-whitespace-before-property": "error", // 禁止属性前有空格,如obj. a
"keyword-spacing":["error",{"before": true, "after": true}] // 关键字前后必须有空格 如 } else {
}
}
5. .gitignore配置
javascript
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
dist
*.local
# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
6. 代码片段配置
vue3快捷模板生成:
json
// vue3快捷模板生成
"vue1": {
"prefix": "vue3",
"body": [
"<template>",
"\t<view class=\"xx\">\n",
"\t</view>",
"</template>\n",
"<script setup lang=\"ts\">",
"import { ref, unref } from 'vue'",
"</script>\n",
"<style lang=\"scss\" scoped>\n",
"</style>\n",
],
"description": "vue3 template"
},
uniapp的view标签快捷生成:
json
"view": {
"prefix": "view",
"body": [
"<view class=\"xx\"></view>",
],
"description": "view"
},