# my-vue-cli
my-vue-cli是我亲手从0到1搭建的仿vue-cli的脚手架,目的是为了学习webpack
项目地址:https://github.com/lyh0371/my-vue-cli
# 为什么造轮子
有人会问,为什么造轮子? vue-cli用着不香吗?
是挺香,但是没有自己造的香,哈哈
进入正题
# my-vue-cli 做了什么
- 环境配置(开发环境,生产环境,检查环境)
- 代码分离(css代码分离及压缩,js代码分离及压缩)
- 开发环境源码调试
- 设置不需要打包的文件
- 自定义控制台输出
- 优化打包体积及生产环境去掉console.log
- 性能,文件体积分析
- eslint+prettier控制代码风格
功能不多,但都是我亲手一点点配置出来的,下面对一些坑做重点说明
# css分割及压缩配置
webpack默认会把所有文件都一股脑打包成一个js,如果不做任何配置,我们写的css文件也会被打包在js文件里面,这样就会导致js文件越来越大,影响页面加载性能。
这时,对应的pulgin也就孕育而生。
mini-css-extract-plugin
需要注意的是这个插件只能在生产环境(production)下配置,并且在loader链中不是使用style-loader
配置代码:
webpack.pro.js 配置loader
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // css 压缩
module:{
rules:[
...
{
test: /\.css$/,
use: [{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: '../',
}
}, "css-loader"]
}
...
]
}
webpack.pro.js 配置plugin
plugins:[
...
new MiniCssExtractPlugin({
filename: './static/css/[name].[hash].css', //配置输出路径
}),
...
]
使用 optimize-css-assets-webpack-plugin 进行代码压缩 配置代码: webpack.pro.js 配置plugin
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');//压缩css插件
plugins:[
...
new OptimizeCssAssetsPlugin(), //css压缩
...
]
# js按需加载配置
由于webpac会把所有文件一股脑都打包到一个js文件,包括我们引入的框架js文件,和我们自己写的整个项目的js文件,如不做任何配置,webpack会把他们都打包到一起,且在加载的时候一次性都加载完毕。 这就会导致如果我们项目过大,打包出来的js文件就会异常的大,影响首屏显示速度。 我们需要做的是:
- 把使用的第三方js和我们的业务代码分离出来
- 每个路页面的js按照路由的切换按需加载
配置代码: 分离出框架的js不需要任何插件,webpack4提供的有对应的配置
//第三方js和业务代码分离出来
module:{
...
optimization: {
splitChunks: {
cacheGroups: {
venders: {
test: /node_modules/,
name: 'vendors',
chunks: 'all'
}
}
}
}
...
}
实现js按需加载需要配置我们路由文件 可能你的路由以前是这样写
import Vue from 'vue'
import Router from 'vue-router'
import Excal from '@/components/excal/Index'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'Excal',
component: Excal
}
]
})
现在需要改成这样
import Vue from "vue";
import Router from "vue-router";
const Hellow = () => import("root/components/hellow");
Vue.use(Router);
export default new Router({
routes: [
{
path: "/",
name: "Hellow",
component: Hellow
},
]
});
对应的webpack配置也需要更改 配置代码: webpack.base.js
test: /\.js$/,
exclude: /node_modules/,
use:[
{
loader: 'babel-loader',
options: {//如果有这个设置则不用再添加.babelrc文件进行配置
"babelrc": false,// 不采用.babelrc的配置
"plugins": [
"@babel/plugin-syntax-dynamic-import"
]
}
}
]
如果不配置webpack直接使用import("root/components/hellow")会报错
# eslint+prettier的配置
使用eslint可以提高我们的代码质量,使用prettier可以规范我们的代码结构,再加上vscode一起使用,简直是大大提高了我们的劳动力! 使用之前你需要下载这么多插件(如果用vue-cli生成项目就要选择下eslint+prettier就可以使用啦
"eslint": "^6.8.0",
"eslint-config-prettier": "^6.9.0",
"eslint-friendly-formatter": "^4.0.1",
"eslint-loader": "^3.0.3",
"eslint-plugin-prettier": "^3.1.2",
"eslint-plugin-vue": "^6.1.2",
"prettier": "^1.19.1",
新建三个文件.eslintrc.js(eslint配置文件).eslintignore(忽略文件),及.prettierrc.js(prettier配置文件) 配置代码: .eslintrc.js
module.exports = {
root: true,
parserOptions: {
parser: 'babel-eslint'
},
env: {
browser: true,
},
extends: ['plugin:vue/essential', 'plugin:prettier/recommended'],
plugins: [
'vue',
'prettier'
],
// add your custom rules here
rules: {
'prettier/prettier': 'error',
// 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off'
'no-console': 0,
"space-before-function-paren": [0, "never"]
}
}
.eslintignore
/build/
/config/
/dis
.prettierrc.js
module.exports = {
tabWidth: 2, // tab 占据两个空格
semi: true, // 语句结尾的分号
};
以上配置也可根据自己喜好进行配置 对webpack进行配置 配置webpack.base.js
rules:[
{
test: /\.(js|vue)$/,
exclude: '/node_modules/',
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src')],
options: {
formatter: require('eslint-friendly-formatter') // 把eslint 的报错信息显示在终端上
}
}
]
对vscode进行配置,实现当我们保存文件时自动按照规则格式化我们的代码
下载vscode插件 ESlint及Vetur,在vscode文件->首选项->设置中配置如下代码
"prettier.eslintIntegration": true,
"eslint.autoFixOnSave": true,
"editor.formatOnSave": true
重启vscode即可
# 其他配置
- clean-webpack-plugin(build前删除上一次打包文件)
- webpack-common-shake(项目瘦身,删除没有使用的代码块)
- friendly-errors-webpack-plugin(自定义控制台输出)
- webpack-bundle-analyze(分析webpack打包结果)
- copy-webpack-plugin(处理不需要打包的文件)
以上pulgin比较好用,且使用起来比较简单,就不一一赘述了