前期回顾
Vue项目实战 —— 后台管理系统( pc端 ) —— Pro最终版本_0.活在风浪里的博客-CSDN博客通用开源后台管理系统https://blog.csdn.net/m0_57904695/article/details/129730440?spm=1001.2014.3001.5501
你把 vite打包 玩明白_0.活在风浪里的博客-CSDN博客webpack 打包看这里(移动端打包)一步一步,一步 从代码到,打包成为手机App,上传至nginx服务器 (Vue项目)_0.活在风浪里的博客-CSDN博客_移动端打包成app一步一步,一步 从代码到,打包成为手机App,上传至ngnix服务器 (Vue项目)手写一个服务器代码将 《vue电商后台管理系统》部署上去 上线、打包_0.活在风浪里的博客-CSDN博客亲测可用,一定会收获颇多,1.上线vue电商后台管理项目2.手写搭建服务器并挂载 (node)3.打包优化 完成上线。.............https://blog.csdn.net/m0_57904695/article/details/126118104?spm=1001.2014.3001.5502 Vite项目,vite + vue3 + ts + vuex + vue-router + axios + scss + 自动导入api(就是用v3不需要引入api直接使用)_vue3 封装axios router vuex_0.活在风浪里的博客-CSDN博客webpack回顾 (移动端打包)一步一步,一步 从代码到,打包成为手机App,上传至nginx服务器 (Vue项目)_0.活在风浪里的博客-CSDN博客_移动端打包一步一步,一步 从代码到,打包成为手机App,上传至ngnix服务器 (Vue项目) https://blog.csdn.net/m0_57904695/article/details/122500485?ops_request_misc=%257B%2522request%255Fid%2522%253A%25221656https://blog.csdn.net/m0_57904695/article/details/125487996?spm=1001.2014.3001.5502
目录
前言:
pnpm:
Vite:
正文开始
1 创建项目:
2 配置eslint:
报错原因:
排错思路:
修改.eslintrc.js文件
3 安装vscode插件ESlint
4 配置prettier
5 配置sass
6 安装Prettier - Code formatter插件
6.1 解决eslint与prettier的冲突
在 .eslintrc.cjs 中 extends 的最后添加一个配置
7 配置styleling
8 配置husky
1:配置好的项目在最后已上传github,此外还有公网地址基于配置好的模板写的后台管理系统:地址:张坤-后台管理系统
2: 在配置过程中会有无数的埋点,作者会站在看官的角度去思考问题,代替直接问出迷惑的地方,并且我会去分析错误,一步步去链接到错误,并在官网中找出答案,而不是直接贴出答案告诉解决方法
3:如果你的配置不精简或者代码太过庞大,逻辑交错复杂,会导致你的运行速度慢,一个页面看不出来具体区别,但是随着项目周期迭代会逐渐显示出 delay
此模板运行启动时间为331ms
pnpm与其他包管理器(如npm和Yarn)的不同之处在于它使用一种称为“硬链接”的独特安装方法。当你使用PNPM安装一个包时,它并不会重复的去下载每个项目的node_modules依赖,而是在一个中心存储位置创建硬链接。这意味着多个项目可以共享同一个包文件,从而节省磁盘空间并减少安装时间。
pnpm可能会缓存,比如修改了一些配置还是使用之前的依赖,可能会导致缓存没生效类似问题,解决方法:
清除pnpm缓存:可以使用
pnpm cache clean
命令来清除pnpm的缓存,这样可以确保使用最新的依赖。强制重新安装依赖:可以使用
pnpm install --force
命令来强制重新安装依赖,这样可以确保使用最新的配置和依赖。检查依赖版本:如果依赖版本不匹配,可能会导致缓存无法生效,因此需要检查依赖的版本是否正确。
使用
--no-cache
选项:在执行命令时,可以使用--no-cache
选项来禁用缓存,这样可以确保使用最新的依赖和配置。更新pnpm:如果你的pnpm版本过旧,可能会导致一些缓存问题,因此需要更新到最新版本。可以使用
npm install -g pnpm
命令来更新pnpm。
pnpm还支持一种称为“虚拟包”的特性,它允许你为包创建别名。虚拟包可用于同时安装多个版本的包,或者在不改变其他包的依赖关系的情况下替换一个包。
pnpm旨在快速高效,它的开发者声称在某些情况下可以比npm或yarn快10倍。它还支持广泛的包锁定文件格式,包括npm、yarn使用的格式。
Vite 不需要提前将所有的代码打包成一个或多个静态文件。相反,Vite 会在浏览器请求资源时动态地编译和提供所需的模块,并在内存中生成对应的静态文件。这种方式可以提高开发体验和构建速度。它还支持热更新和代码分割等功能,使得开发者能够更快地进行开发、调试和部署。
比如有a、b、c三个页面,a页面是错误的,只要不在首屏加载调用,它只会在项目启动了,进入a页面,提示报错
pnpm create vite my-vue-app --template vue-ts
创建项目非常简单、Vite也很快
—————————————————— 创建项目完 ———————————————————
eslint
可以保证项目的质量,prettier
可以保证项目的统一格式、风格。
执行安装命令
pnpm add eslint -D
执行eslint初始化命令
pnpm eslint --init
依次选择初始化选项:
图片描述:
具体选项描述
(1) How would you like to use ESLint?
选择:To check syntax and find problems
(2) What type of modules does your project use?
选择:JavaScript modules (import/export)
(3) Which framework does your project use?
选择:Vue.js
(4) Does your project use TypeScript?
选择:Yes
(5) Where does your code run?
选择:Browser
(6) What format do you want your config file to be in?
选择:JavaScript
(7) Would you like to install them now?
选择:Yes
(8) Which package manager do you want to use?
选择:pnpm
依赖安装完成后,会生成 .eslintrc.js
配置文件 ,此时打开 .eslintrc.js
配置文件会出现一个报错,需要再 env
字段中增加 node: true
配置以解决eslint找不到module的报错
修改如下:
module.exports = {
"env": {
"browser": true,
"es2021": true,
// 新增
"node": true
},
"extends": [
"eslint:recommended",
"plugin:vue/vue3-essential",
"plugin:@typescript-eslint/recommended"
],
"parserOptions": {
"ecmaVersion": "latest",
"parser": "@typescript-eslint/parser",
"sourceType": "module"
},
"plugins": [
"vue",
"@typescript-eslint"
],
"rules": {
}
}
在 package.json
文件中的 script
中添加lint
命令
{
"scripts": {
// eslint . 为指定lint当前项目中的文件
// --ext 为指定lint哪些后缀的文件
// --fix 开启自动修复
"lint": "eslint . --ext .vue,.js,.ts,.jsx,.tsx --fix"
}
}
执行lint
命令
pnpm lint
发现报错了,执行不了,
eslint
默认是不会解析.vue
后缀文件的。因此,需要一个额外的解析器来解析.vue
后缀文件。
查看官网解释如下:
User Guide | eslint-plugin-vue
但是我们查看.eslintrc.js
文件中的extends
会发现已经有继承"plugin:vue/vue3-essential"
的配置。
然后在node_modules
中可以找到eslint-plugin-vue/lib/cinfigs/essential
,里面配置了extends
是继承于同级目录下的base.js
,
在base.js里面会发现parser: require.resolve('vue-eslint-parser')
这个配置。因此,按道理来说应该是会解析.vue
后缀文件的。
继续往下看.eslintrc.js
文件中的extends
会发现,extends
中还有一个"plugin:@typescript-eslint/recommended"
,
它是来自于/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended.js
,
查看该文件会发现最终继承于同级目录下的base.js
文件。从该文件中可以发现parser: '@typescript-eslint/parser',
配置。
按照.eslintrc.js
文件中的extends
配置的顺序可知,最终导致报错的原因就是@typescript-eslint/parser
把vue-eslint-parser
覆盖了。
如果已经使用了另外的解析器(例如"parser": "@typescript-eslint/parser"
),则需要将其移至parseOptions
,这样才不会与vue-eslint-parser
冲突。
.eslintrc.js
文件module.exports = {
env: {
browser: true,
es2021: true,
// 新增
node: true
},
extends: [
'eslint:recommended',
'plugin:vue/vue3-essential',
'plugin:@typescript-eslint/recommended'
],
// 新增
parser: 'vue-eslint-parser',
parserOptions: {
ecmaVersion: 'latest',
parser: '@typescript-eslint/parser',
sourceType: 'module'
},
plugins: ['vue', '@typescript-eslint'],
rules: {}
};
此时,再执行 pnpm lint
,就会发现校验通过了。但是出现警告了
该警告建议你更新配置文件以避免意外加载~/.eslintrc.*
,可以在项目的ESLint配置文件中添加root:true
选项来解决该问题。
你可以在.eslintrc.js
或.eslintrc.json
文件中添加以下内容:json
{
"root": true,
"rules": {
// ...其他规则
}
}
如果使用的是旧版本的ESLint,则可能需要将其升级到支持'root'属性的最新版本。
此外,如果你不需要在全局范围内使用ESLint配置文件,请删除位于用户主目录下的~/.eslintrc.*
文件,以避免被意外加载。
修改.eslintrc.js
文件
module.exports = {
env: {
browser: true,
es2021: true,
// 新增
node: true
},
extends: [
'eslint:recommended',
'plugin:vue/vue3-essential',
'plugin:@typescript-eslint/recommended'
],
// 新增
parser: 'vue-eslint-parser',
parserOptions: {
ecmaVersion: 'latest',
parser: '@typescript-eslint/parser',
sourceType: 'module'
},
plugins: ['vue', '@typescript-eslint'],
// 新增
"root": true,
rules: {}
};
再次运行如下:
——————————————— 配置ESLint完 ——————————————————
如果写一行代码就要执行一遍lint
命令,这效率就太低了。所以我们可以配合vscode的ESLint
插件,实现每次保存代码时,自动执行lint
命令来修复代码的错误。
在项目中新建.vscode/settings.json
文件,然后在其中加入以下配置
{
// 开启自动修复
"editor.codeActionsOnSave": {
"source.fixAll": false,
"source.fixAll.eslint": true
}
}
—————————————— 安装vscode插件ESlint完 —————————————————
执行安装命令
pnpm add prettier -D
在根目录下新建.prettierrc.js 下面会修改为prettierrc.cjs
添加以下配置,更多配置可查看官方文档
module.exports = {
// 一行的字符数,如果超过会进行换行,默认为80
printWidth: 80,
// 一个tab代表几个空格数,默认为80
tabWidth: 2,
// 是否使用tab进行缩进,默认为false,表示用空格进行缩减
useTabs: false,
// 字符串是否使用单引号,默认为false,使用双引号
singleQuote: true,
// 行位是否使用分号,默认为true
semi: false,
// 是否使用尾逗号,有三个可选值""
trailingComma: "none",
// 对象大括号直接是否有空格,默认为true,效果:{ foo: bar }
bracketSpacing: true
}
在package.json
中的script
中添加以下命令
{
"scripts": {
"format": "prettier --write \"./**/*.{html,vue,ts,js,json,md,scss}\"",
}
}
运行该命令,会将我们项目中的文件都格式化一遍,后续如果添加其他格式的文件,可在该命令中添加,例如:.less
后缀的文件
好的,又出错了,你可以看看有多少细节、埋坑
问题描述:
错误信息提示 .prettierrc.js
配置文件存在问题。似乎该文件被视为 ES 模块文件。
怎么解决:
可以尝试以下几种解决方法:
将
.prettierrc.js
文件重命名为.prettierrc.cjs
,以明确指示该文件为 CommonJS 模块。修改引用该文件的代码,使用动态
import()
。这种方法适用于所有的 CommonJS 模块。在
package.json
中将"type": "module"
修改为"type": "commonjs"
,以将所有的.js
文件都视为 CommonJS 模块。如果需要使用 ES 模块,则可以使用.mjs
文件扩展名。升级到 Prettier 2.3.2 或更高版本,该版本已经支持
.prettierrc.js
文件的 ES 模块语法。
本次采用第一种方式
—————————————— 配置prettier完 —————————————————
要在 Vite 项目中使用 Sass,需要安装 sass
和 sass-loader
依赖。然后,在 vite.config.ts
文件中进行如下配置:
pnpm install sass sass-loader --save-dev
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
css: {
preprocessorOptions: {
scss: {
// 这里可以添加全局的 Sass 变量、Mixin等。首先你的有这个文件
// additionalData: `
// @import "@/styles/variables.scss";
// @import "@/styles/mixins.scss";
// `,
}
}
}
})
其中,additionalData
属性可以用来引入全局的 Sass 变量和 Mixin 等,并且会在每个 .scss
文件中自动注入。
在 Vue 组件中,可以直接使用 lang="scss"
来编写 Sass 样式:(前提你的有这个文件并且里面写有这个变量)
{{ msg }}
—————————————— 配置sass完 —————————————————
安装该插件的目的是,让该插件在我们保存的时候自动完成格式化
在.vscode/settings.json
中添加一下规则
{
// 保存的时候自动格式化
"editor.formatOnSave": true,
// 默认格式化工具选择prettier
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
eslint
与prettier
的冲突
在理想的状态下,
eslint
与prettier
应该各司其职。eslint
负责我们的代码质量,prettier
负责我们的代码格式。但是在使用的过程中会发现,由于我们开启了自动化的eslint
修复与自动化的根据prettier
来格式化代码。所以我们已保存代码,会出现屏幕闪一起后又恢复到了报错的状态。这其中的根本原因就是
eslint
有部分规则与prettier
冲突了,所以保存的时候显示运行了eslint
的修复命令,然后再运行prettier
格式化,所以就会出现屏幕闪一下然后又恢复到报错的现象。这时候你可以检查一下是否存在冲突的规则。查阅资料会发现,社区已经为我们提供了一个非常成熟的方案,即
eslint-config-prettier
+eslint-plugin-prettier
。
- eslint-plugin-prettier: 基于 prettier 代码风格的 eslint 规则,即eslint使用pretter规则来格式化代码。
- eslint-config-prettier: 禁用所有与格式相关的 eslint 规则,解决 prettier 与 eslint 规则冲突,确保将其放在 extends 队列最后,这样它将覆盖其他配置
安装依赖
pnpm add eslint-config-prettier eslint-plugin-prettier -D
.eslintrc.cjs
中 extends
的最后添加一个配置 {
extends: [
'eslint:recommended',
'plugin:vue/vue3-essential',
'plugin:@typescript-eslint/recommended',
// 新增,必须放在最后面
'plugin:prettier/recommended'
],
}
module.exports = {
env: {
browser: true,
es2021: true,
// 新增
node: true
},
extends: [
'eslint:recommended',
'plugin:vue/vue3-essential',
'plugin:@typescript-eslint/recommended',
// 新增,必须放在最后面
'plugin:prettier/recommended'
],
// 新增
parser: 'vue-eslint-parser',
parserOptions: {
ecmaVersion: 'latest',
parser: '@typescript-eslint/parser',
sourceType: 'module'
},
plugins: ['vue', '@typescript-eslint'],
// 新增
root: true,
rules: {}
}
—————————————— 冲突解决完 —————————————————
stylelint 为css的lint工具。可格式化css代码,检查css语法错误与不合理的写法,指定css书写顺序等...
由于我的项目使用的sass预处理器,因此配置的为sass相关的,项目中使用其他预处理器的可以按照该配置方法改一下就好
安装依赖
// less
pnpm add stylelint postcss postcss-less postcss-html stylelint-config-prettier stylelint-config-recommended-less stylelint-config-standard stylelint-config-standard-vue stylelint-less stylelint-order -D
//scss
pnpm add stylelint postcss postcss-scss postcss-html stylelint-config-prettier stylelint-config-recommended-scss stylelint-config-standard stylelint-config-standard-vue stylelint-scss stylelint-order -D
增加.stylelintrc.cjs
配置文件 为什么是.cjs 与 4 配置prettier 同理
less:
module.exports = {
extends: [
'stylelint-config-standard',
'stylelint-config-prettier',
'stylelint-config-recommended-less',
'stylelint-config-standard-vue'
],
plugins: ['stylelint-order'],
// 不同格式的文件指定自定义语法
overrides: [
{
files: ['**/*.(less|css|vue|html)'],
customSyntax: 'postcss-less'
},
{
files: ['**/*.(html|vue)'],
customSyntax: 'postcss-html'
}
],
ignoreFiles: [
'**/*.js',
'**/*.jsx',
'**/*.tsx',
'**/*.ts',
'**/*.json',
'**/*.md',
'**/*.yaml'
],
rules: {
'no-descending-specificity': null, // 禁止在具有较高优先级的选择器后出现被其覆盖的较低优先级的选择器
'selector-pseudo-element-no-unknown': [
true,
{
ignorePseudoElements: ['v-deep']
}
],
'selector-pseudo-class-no-unknown': [
true,
{
ignorePseudoClasses: ['deep']
}
],
// 指定样式的排序
'order/properties-order': [
'position',
'top',
'right',
'bottom',
'left',
'z-index',
'display',
'justify-content',
'align-items',
'float',
'clear',
'overflow',
'overflow-x',
'overflow-y',
'padding',
'padding-top',
'padding-right',
'padding-bottom',
'padding-left',
'margin',
'margin-top',
'margin-right',
'margin-bottom',
'margin-left',
'width',
'min-width',
'max-width',
'height',
'min-height',
'max-height',
'font-size',
'font-family',
'text-align',
'text-justify',
'text-indent',
'text-overflow',
'text-decoration',
'white-space',
'color',
'background',
'background-position',
'background-repeat',
'background-size',
'background-color',
'background-clip',
'border',
'border-style',
'border-width',
'border-color',
'border-top-style',
'border-top-width',
'border-top-color',
'border-right-style',
'border-right-width',
'border-right-color',
'border-bottom-style',
'border-bottom-width',
'border-bottom-color',
'border-left-style',
'border-left-width',
'border-left-color',
'border-radius',
'opacity',
'filter',
'list-style',
'outline',
'visibility',
'box-shadow',
'text-shadow',
'resize',
'transition'
]
}
}
scss:
module.exports = {
extends: [
'stylelint-config-standard',
'stylelint-config-prettier',
'stylelint-config-recommended-scss',
'stylelint-config-standard-vue'
],
plugins: ['stylelint-order'],
// 不同格式的文件指定自定义语法
overrides: [
{
files: ['**/*.(scss|css|vue|html)'],
customSyntax: 'postcss-scss'
},
{
files: ['**/*.(html|vue)'],
customSyntax: 'postcss-html'
}
],
ignoreFiles: [
'**/*.js',
'**/*.jsx',
'**/*.tsx',
'**/*.ts',
'**/*.json',
'**/*.md',
'**/*.yaml'
],
rules: {
'no-descending-specificity': null, // 禁止在具有较高优先级的选择器后出现被其覆盖的较低优先级的选择器
'selector-pseudo-element-no-unknown': [
true,
{
ignorePseudoElements: ['v-deep']
}
],
'selector-pseudo-class-no-unknown': [
true,
{
ignorePseudoClasses: ['deep']
}
],
// 指定样式的排序
'order/properties-order': [
'position',
'top',
'right',
'bottom',
'left',
'z-index',
'display',
'justify-content',
'align-items',
'float',
'clear',
'overflow',
'overflow-x',
'overflow-y',
'padding',
'padding-top',
'padding-right',
'padding-bottom',
'padding-left',
'margin',
'margin-top',
'margin-right',
'margin-bottom',
'margin-left',
'width',
'min-width',
'max-width',
'height',
'min-height',
'max-height',
'font-size',
'font-family',
'text-align',
'text-justify',
'text-indent',
'text-overflow',
'text-decoration',
'white-space',
'color',
'background',
'background-position',
'background-repeat',
'background-size',
'background-color',
'background-clip',
'border',
'border-style',
'border-width',
'border-color',
'border-top-style',
'border-top-width',
'border-top-color',
'border-right-style',
'border-right-width',
'border-right-color',
'border-bottom-style',
'border-bottom-width',
'border-bottom-color',
'border-left-style',
'border-left-width',
'border-left-color',
'border-radius',
'opacity',
'filter',
'list-style',
'outline',
'visibility',
'box-shadow',
'text-shadow',
'resize',
'transition'
]
}
}
package.json
增加命令
"scripts": {
"prepare": "husky install",
"dev": "vite",
"build": "vue-tsc --noEmit && vite build",
"preview": "vite preview",
"lint": "eslint . --ext .vue,.js,.ts,.jsx,.tsx --fix",
"format": "prettier --write \"./**/*.{html,vue,ts,js,json,md}\"",
"lint:style": "stylelint \"./**/*.{css,less,scss,vue,html}\" --fix"
},
安装vscode的Stylelint插件
安装该插件可在我们保存代码时自动执行stylelint
在.vscode/settings.json
中添加一下规则
{
// 开启自动修复
"editor.codeActionsOnSave": {
"source.fixAll": false,
"source.fixAll.eslint": true,
"source.fixAll.stylelint": true
},
// 保存的时候自动格式化
"editor.formatOnSave": true,
// 默认格式化工具选择prettier
"editor.defaultFormatter": "esbenp.prettier-vscode",
// 配置该项,新建文件时默认就是space:2
"editor.tabSize": 2,
// stylelint校验的文件格式
"stylelint.validate": ["css", "less", "vue", "html"]
}
虽然上面已经配置好了
eslint
、preitter
与stylelint
,但是还是存在以下问题。对于不使用
vscode
的,或者没有安装eslint
、preitter
与stylelint
插件的同学来说,就不能实现在保存的时候自动的去修复与和格式化代码。这样提交到
git
仓库的代码还是不符合要求的。因此需要引入强制的手段来保证提交到git
仓库的代码时符合我们的要求的。
husky
是一个用来管理git hook
的工具,git hook
即在我们使用git
提交代码的过程中会触发的钩子。
安装依赖
pnpm add husky -D
在package.json
中的script
中添加一条脚本命令
{
"scripts": {
"prepare": "husky install"
},
}
该命令会在
pnpm install
之后运行,这样其他克隆该项目的同学就在装包的时候就会自动执行该命令来安装husky
。这里我们就不重新执行pnpm install
了,直接执行pnpm prepare
,这个时候你会发现多了一个.husky
目录。然后使用
husky
命令添加pre-commit
钩子,运行
pnpm husky add .husky/pre-commit "pnpm lint && pnpm format && pnpm lint:style"
执行完上面的命令后,会在.husky
目录下生成一个pre-commit
文件
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
pnpm lint && pnpm format
现在当我们执行 git commit
的时候就会执行 pnpm lint
与 pnpm format
,当这两条命令出现报错,就不会提交成功。以此来保证提交代码的质量和格式。
_______________________________ 期待再见 _______________________________