前言
最近学习了一些webpack的配置,于是打算自己搭一个简单的vue项目,不去直接使用vue-cli工具去生成。此项目没有使用vue-router和vuex,有兴趣的小伙伴可以自行思考添加
实现思路及步骤
- 首先创建三个配置文件,分别是webpack.common.js(公共配置文件),开发配置文件(webpack.dev.js),生产配置文件(webpack.prod.js)
- 安装webpack,
npm install webpack webpack-cli webpack-dev-server webpack-merge -D,webpack-merge 是用来把两个webpack配置文件合并用的 - 安装编译css资源文件的依赖
npm install style-loader css-loader less-loader less -D - 安装js资源文件的依赖
npm install babel-loader @babel/core @babel/preset-env -D - 安装图片资源文件的依赖
npm install file-loader url-loader -D这里会有个小问题,配置loader的时候,注意添加配置选项 " esModule: false ",因为vue使用的是commonjs语法规范,而file-loader/url-loader使用的es module语法规范。所以不设置的话,vue-loader处理之后img src会变成"[object Module]" - 安装vue资源文件的依赖
npm install core-js vue -S和npm install vue-loader vue-style-loader vue-template-compiler -D - 安装一些功能插件
npm install clean-webpack-plugin copy-webpack-plugin html-webpack-plugin -D - 目前就可以正常的进行打包和调试了。后期可以尝试着加上一些eslint检查,路由和vuex。
- 使用eslint,先安装eslint
npm install eslint eslint-loader babel-eslint -D,安装完后,生成eslint的配置文件,执行命令npx eslint --init - 配置webpack的module.rules,对js和vue文件设置eslint-loader
- 设置eslint的配置文件 .eslinttrc.js
- 设置eslint的忽略文件 .eslintignore
PS: 项目地址: github.com/blueSky1008…
实现过程
- webpack.common.js
// webpack.common.js
const HtmlWebpackPlugin = require('html-webpack-plugin')
const VueLoaderPlugin = require('vue-loader/lib/plugin') // 配合 vue-loader 使用,用于编译转换 .vue 文件
const webpack = require('webpack')
const path = require('path')
module.exports = {
entry: './src/main.js',
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js'
},
module: {
rules: [
{
test: /.vue$/,
use: 'vue-loader'
},
{
test: /.js$/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
},
{
test: /.css$/,
use: [ 'style-loader', 'css-loader' ]
},
{
test: /.less$/,
use: [ 'style-loader', 'css-loader', 'less-loader' ]
},
{
test: /\.(png|jpe?g|gif)$/,
use: {
loader: 'url-loader',
options: {
limit: 10 * 1024,
// 解决vue-loader处理之后img src变成"[object Module]"问题
esModule: false // 不使用esModule的规范,因为vue使用的是commonjs语法规范,而file-loader/url-loader使用的es module语法规范。
}
}
},
]
},
plugins: [
new webpack.DefinePlugin({
// 值要求的是一个代码片段
BASE_URL: JSON.stringify('')
}),
new VueLoaderPlugin(),
new HtmlWebpackPlugin({
title: '自己实现一个vue的webpack配置文件',
template: './public/index.html',
minify: false,
inject: true
}),
],
}
- webpack.dev.js
// webpack.dev.js
const { merge } = require('webpack-merge') // 用来合并webpack配置文件
const webpack = require('webpack')
const common = require('./webpack.common.js')
module.exports = merge(common, {
mode: 'development',
devtool: 'cheap-module-eval-source-map',
devServer: {
hot: true, //启用 webpack 的模块热替换特性
open: true, //自动打开浏览器
contentBase: 'public', // 静态资源目录
},
plugins: [
new webpack.HotModuleReplacementPlugin()
]
})
- webpack.prod.js
// webpack.prod.js
const { merge } = require('webpack-merge')
const common = require('./webpack.common.js')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')
module.exports = merge(common, {
mode: 'production',
plugins: [
new CleanWebpackPlugin(),
new CopyWebpackPlugin({
patterns: ['public']
})
]
})
- package.json
{
"name": "webpack-vue-zero",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "webpack-dev-server --config webpack.dev.js --open",
"build": "webpack --config webpack.prod.js"
},
"dependencies": {
"core-js": "^3.6.5",
"vue": "^2.6.11"
},
"devDependencies": {
"@babel/core": "^7.12.3",
"@babel/preset-env": "^7.12.1",
"@vue/cli-plugin-babel": "^4.5.8",
"babel-loader": "^8.1.0",
"clean-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^6.2.1",
"css-loader": "^5.0.0",
"file-loader": "^6.1.1",
"html-webpack-plugin": "^4.5.0",
"less": "^3.12.2",
"less-loader": "^7.0.2",
"style-loader": "^2.0.0",
"url-loader": "^4.1.1",
"vue-loader": "^15.9.3",
"vue-style-loader": "^4.1.2",
"vue-template-compiler": "^2.6.12",
"webpack": "^4.27.1",
"webpack-cli": "^3.1.2",
"webpack-dev-server": "^3.1.10",
"webpack-merge": "^5.2.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}
使用Eslint去实现代码风格的校验与检查
- webpack.common.js 文件增加一个module.rules
// webpack.common.js
module.exports = {
module: {
rules: [
{
test: /.(js|vue)$/,
use: 'eslint-loader',
enforce: 'pre', // 编译前检查
exclude:/(node_modules)/
}
]
}
}
- 设置eslint的配置文件 .eslinttrc.js
// .eslinttrc.js
module.exports = {
root: true, // 告诉eslint使用此文件为配置文件,可以不写,只是方便直接定位到此文件
env: {
browser: true, // 可以使用浏览器的环境变量
node: true, // 可以使用node的变量
commonjs: true, // 可以使用commonjs规范
es6: true
},
extends: [
'plugin:vue/essential',
'standard' // eslint的规则模板
],
parserOptions: {
ecmaVersion: 12,
sourceType: 'module', // 使用es module模块
parser: 'babel-eslint', // eslint的解析器
jsx: true // 开启jsx
},
plugins: [
'vue'
],
rules: {
}
}
- 设置eslint的忽略文件 .eslintignore
/build/
/config/
/dist/
/static/
/*.js
- 在package.json中设置eslint的执行命令
{
"name": "webpack-vue-zero",
"version": "0.1.0",
"private": true,
"scripts": {
"lint": "eslint --ext .js,.vue src",
"lintfix": "eslint --fix --ext .js,.vue src"
},
}
命令 eslint --ext .js,.vue src
--ext 是用来指定在哪个目录下执行eslint的
.js,.vue 是指对哪些文件执行eslint src 是文件夹名字
--fix 是eslint先自动修复一些问题,剩下不能修复的再由开发人员手动修复