webpack 基础篇
### 安装本地webpack
- webpack webpack-cli -D
https://www.webpackjs.com/concepts/#%E6%8F%92%E4%BB%B6-plugins-
entry
output
loader
plugins
mode
resolve https://webpack.js.org/configuration/resolve/#root
1
2
3
4
5
6
7resolve:{
alias: { // 别名, import a from './src/utils/a.js' 简写 import a from 'utils/a.js'
utils: path.resolve(__dirname, 'src/utils/'),
Templates: path.resolve(__dirname, 'src/templates/')
}
extensions: ['.js', '.vue', '.css', '.json'] // 引入文件时候没有后缀名会按照这个次序去找
}
开发服务器配置 webpack-dev-server
原理:启动了一个 express 的静态服务
1 | //更多配置 https://webpack.js.org/configuration/dev-server/ |
使用插件 htmlwebpackPlugin 去自动引用模版
htmlwebpackPlugin
- 基本使用
1 | new HtmlWebpacklugin({ |
loader 非 js 文件的处理 , 高级 js 语法转化
css 处理
1 | //loder的解析 |
es6 转 es5
babel-loader
@babel/core : babel 的核心方法,可以调用 transform
@babel/preset-env :如何转化 es6=》es5 ( 按需编译和按需打补丁)
1 | { |
//其他插件可以去 babel 官网查看
@babel/plugin-transform-runtime:是对 Babel 编译过程中产生的 helper 方法进行重新利用(聚合),以达到减少打包体积的目的。此外还有个作用是为了避免全局补丁污染,对打包过的 bunler 提供”沙箱”式的补丁。配合产线的 @babel/runtime (放生产包,安装不要加 —D)
polyfill(弃用):core-js + regenerator
core-js:实现 JavaScript 标准运行库之一,它提供了从 ES3 ~ ES7+ 以及还处在提案阶段的 JavaScript 的实现
esLint 代码规范引用
安装 eslint, aslant-loader
1 | rules: [ |
图片处理
1 | // 三种 打包图片 |
全局变量
1) expose-loader 暴露到 window 上
2)providePlugin 给每个人提供一个\$
场景:在模块中不用引入 jqury 包就可以使用\$
webpack 配置:
1 | const webpack = require("webpack"); |
- 引入不打包 cdn 在 html 中引入
文件分类
在 mode:”production”,其他不要加
- 图片
1 | { |
2) css
1 | new miniCssExtractPlugiin({ |
- cdn 资源引入
1 | output: { |
配置篇
打包多页应用
1 | entry: { |
配置 source-map
源码映射
1 | //1)源码映射, 单独生成一个.map文件,出错会定位到报错的行和列 文件大且全 |
watch 用法
修改代码,实时打包。编译
webpack-dev-server:默认 watch 开启,为 true,
1 | watch: true, |
小插件应用
clean-webpack-plugin :清空之前的打包目录文件
1 | let { CleanWebpackPlugin } = require("clean-webpack-plugin"); |
copy-webpack-plugin :指定目录下的文件打包到 dist 文件下 ,如 public
1 | let copyWebpackPlugin = require("copy-webpack-plugin"); |
跨域问题
1 | // 1) |
优化篇
noparse :打包时候不用在继续查找依赖看他是否有依赖
1
2
3
4
5
6module.exports = {
//...
module: {
noParse: /jquery|lodash/
}
};
2) rules:中 exclude,include
1 | module.exports = { |
3) IgnorePlugin :导入模块中多余模块的剔除
1 | //如moment引入了很多语言包,先去掉所有的语言包 |
dllPlugin ==》 DllReferencePlugin: 拆分
happypack 多线程打包 //项目小不要用,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41let happypack = require('happypack')
//...
module:{
rules:[
//...
{
test: /\.js$/,
include: path.resolve(__dirname, "src"),
exclude: /node_modules/,
use: 'happypack/loader?id=js'
},
{
test: /\.css$/,
use: 'happypack/loader?id=css'
}
]
}
plugins:[
new happypack({
id:'js',
use:[
{
loader:'babel-loader',
options:{
// 用babel-loader 把es6-es5
presets: ["@babel/preset-env"]
}
}
]
})
new happypack({
id:'css',
use:[
{
loader:'style-loader,css-loader',
}
]
})
//...
]抽离公共代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20optimization:{
splitChunks:{ // 分割代码块
cacheGroups:{ // 缓存组
common:{ //公共的模块 的抽离
chunks:'initial',// 开始入口的时候抽离 ,
minSize:1, // 文件大小大于多少字节抽离,
minChunks:3 // 使用次数大于多少时候抽离
},
vendor:{ //第三方模块的抽离
priority:1, // 提升优先级(公用模块应用了第三方东西)
test:/node_modules/, // 把你抽离出来
chunks:'initial',
minSize:1,
minChunks:3
}
}
}
}
7) webpack 自带优化
用 import 在生产模式下,会自动去掉没用的代码, tree-shaking: 把没用的代码,自动剔除 require 引入不行
scope hosting 作用域提升 :在 webpack 中自动把一些代码简化了
1
2
3let a = 1;
let b = 2;
let c = a + b; //打包时候会直接c =3,上面的a,b去掉了
懒加载
1 | //es6草案中的语法 |