github.com/17698753015…
- 这是一个使用 Vue CLI 创建出来的 Vue 项目基础结构
- 有所不同的是这里我移除掉了 vue-cli-service(包含 webpack 等工具的黑盒工具)
- 这里的要求就是直接使用 webpack 以及你所了解的周边工具、Loader、Plugin 还原这个项目的打包任务
- 尽可能的使用上所有你了解到的功能和特性
一、安装、配置 webpack
yarn add webpack webpack-cli --dev
- 初始化webpack.config.js,在根目录下新建
module.exports = {
mode: string,
entry: string|Array<string>,
moodule: object,
plugins: Array<object>
}
- webpack.config.js mini版(会报错这个因为我们没有对里面的less 和 vue 做任何处理)
const path = require('path')
module.exports = {
mode: 'none',
entry: './src/main.js',
output: {
path: path.join(__dirname, 'dist'),
filename: 'bundle.js'
},
module: {
},
plugins: []
}
二、对vue less 图片 分别处理
yarn add vue-style-loader css-loader less-loader --dev
module: {
rules: [
{
test: /.less$/,
use: ['vue-style-loader', 'css-loader', 'less-loader']
}
]
}
yarn add vue-loader style-loader --dev
const VueLoaderPlugin = require('vue-loader/lib/plugin')
module: {
rules: [
{
test: /.less$/,
use: ['vue-style-loader', 'css-loader', 'less-loader']
},
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
}
]
}
plugins: [
new VueLoaderPlugin(),
]
yarn add file-loader --dev[](url)
module: {
rules: [
{
test: /.less$/,
use: ['vue-style-loader', 'css-loader', 'less-loader']
},
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
},
{
test: /\.(png|jpg|gif|svg)$/,
loader: 'file-loader',
options: {
esModule: false,
name: '[name].[ext]?[hash]'
}
}
]
}
plugins: [
new VueLoaderPlugin(),
]
- 对html进行处理
- 想一想我们虽根据入口文件将都打包起来,但是最终我们需要将 js css 放到html里面的这样才能够展示出来。loader 只能够匹配某一类文件在文件内部处理。并不能跨文件处理。这个时候就plugins处理
yarn add html-webpack-plugin --dev
const HtmlWebpackPlugin = require('html-webpack-plugin')
....
plugins: [
new HtmlWebpackPlugin({
title: 'my-app',
filename: 'index.html',
template: 'public/index.html'
}),
]
三、对webpack打包进行优化
- webpack-dev-server安装在项目里面方便使用。
yarn add webpack-dev-server --dev
yarn webpack-dev-server --open
- 拆分css 如果有相同的提取出来 (目前内部样式表)
yarn add mini-css-extract-plugin --dev
{
test: /.less$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'less-loader']
},
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader'
]
},
plugins: [
new MiniCssExtractPlugin({
filename: '[hash].[name].css'
})
]
- 在生产模式下webpack 会默认压缩js 和 html 但是不会压缩css 这里需要单独的插件
yarn add optimize-css-assets-webpack-plugin --dev
optimization: {
usedExports: true,
concatenateModules: true,
minimizer: [
new OptimizeCssAssetsWebpackPlugin(),
new TerserWebpackPlugin()
]
},
yarn add @babel/core @babel/preset-env babel-loader --dev
{
test: /\.js$/,
loader: 'babel-loader',
options: {
presets: [
['@babel/preset-env']
]
}
},
optimization: {
usedExports: true,
splitChunks: {
chunks: 'all'
},
concatenateModules: true,
minimizer: [
new OptimizeCssAssetsWebpackPlugin(),
new TerserWebpackPlugin()
]
},
四、配置ESlint并且在webpack中使用
yarn add eslint --dev
yarn eslint --init
- eslint 结合 vscode
- 下载vscode eslint插件就可以看见是否报错。
- eslint 结合 webpack
- eslint结合webpack是以loader的模式结合的。
yarn add eslint-loader
{
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [path.resolve(__dirname, 'src')]
}
五、配置stylelint并且在webpack中使用
yarn add stylelint --dev
yarn add stylelint-config-css-modules --dev
yarn add stylelint-config-prettier --dev
yarn add stylelint-config-rational-order --dev
yarn add stylelint-config-standard --dev
yarn add stylelint-declaration-block-no-ignored-properties --dev
yarn add stylelint-order --dev
module.exports = {
"extends": [
"stylelint-config-standard",
"stylelint-config-css-modules",
"stylelint-config-rational-order",
"stylelint-config-prettier"
],
"plugins": ["stylelint-order", "stylelint-declaration-block-no-ignored-properties"],
"rules": {
"no-descending-specificity": null,
"plugin/declaration-block-no-ignored-properties": true,
"at-rule-no-unknown": null
}
}
- stylelint 结合 vscode
- 下载vscode stylelint插件就可以看见是否报错。
- style结合webpack ------stylelint-webpack-plugin
const StyleLintPlugin = require('stylelint-webpack-plugin')
plugins:[
new StyleLintPlugin({
files: ['src/**/*.vue', 'src/**/*.less']
})
]
"scripts": {
"style:fix": "stylelint 'src/**/*.l?(e|c)ss' 'src/**/*.vue' --fix"
},
六、独立拆分开发和生产的webpack配置
- 新建webpack配置文件
- webpack.dev.js // 开发插件文件配置
- webpack.prod.js // 生产插件文件配置
- webpack.common.js // 公共文件配置
- 三个文件夹分别导出一个对象。
- 我们需要webpack-merge这个插件组合起来
const common = require('./weebpack.common')
const { merge } = require('webpack-merge')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
const CopyPlugin = require('copy-webpack-plugin')
module.exports = merge(common, {
mode: 'production',
devtool: false,
plugins: [
new CleanWebpackPlugin(),
new CopyPlugin({
patterns: [
{ from: 'public' }
]
})
]
})
七、根据git hooks 提交检测
"scripts": {
"stylelint": "stylelint 'src/**/*.l?(e|c)ss' 'src/**/*.vue' --fix",
"eslint": "eslint 'src/**/*.js' 'src/**/*.vue' --fix",
"lint": "run-p eslint stylelint",
"preCommit": "lint-staged"
},
yarn add husky --dev
"husky": {
"hooks": {
"pre-commit": "npm run lint"
}
},
yarn add lint-staged --dev
"lint-staged": {
"*.js": [
"eslint",
"git add"
]
},