# 初始化
npm i webpack webpack-cli --save-dev
# 各种loader
npm i @babel/core @babel/preset-env babel-loader -D
npm i react react-dom @babel/preset-react -D
npm i style-loader css-loader -D
npm i less less-loader -D
npm i file-loader -D
npm i url-loader -D
# 热更新
1.package.json
加个--watch
缺点 必须自己刷新
2.webpack-dev-server
# 文件指纹
npm i mini-css-extract-plugin -D
webpack中的hash、chunkhash、contenthash区别
hash 整个项目公用一个hash值
chunkhash 根据入口来 相同入口公用一个
contenthash 保证即使css文件所处的模块里就算其他文件内容改变,只要css文件内容不变,那么不会重复构建。
# 压缩
# css
npm i optimize-css-assets-webpack-plugin -D --registry=https://registry.npm.taobao.org
npm i cssnano -D
# html
npm i html-webpack-plugin -D
new HtmlWebpackPlugin({
template: path.join(__dirname, 'src/search.html'),
filename: 'search.html',
chunks: ['search'],
inject: true,
minify: {
html5: true,
collapseWhitespace: true,
preserveLineBreaks: false,
minifyCSS: true,
minifyJS: true,
removeComments: false
}
})
# 清除代码
npm i clean-webpack-plugin -D
const {CleanWebpackPlugin} = require('clean-webpack-plugin')
new CleanWebpackPlugin()
# css自动补前缀
npm i postcss-loader autoprefixer -D --registry=https://registry.npm.taobao.org
在less loader里加上
# px转rem
npm i px2rem-loader -D
npm i lib-flexible -S
# 内联
npm i raw-loader@0.5.1 -D
<!DOCTYPE html>
<html lang="en">
<head>
${ require('raw-loader!./meta.html')}
<title>Document</title>
<script>${require('raw-loader!babel-loader!../node_modules/lib-flexible/flexible.js')}</script>
</head>
<body>
<div id="root"></div>
</body>
</html>
# tree shaking
生产环境默认开启 去掉没用到的
# 多页面打包
npm i glob -D
# source-map
eval 用eval包裹住代码 后面跟source
source-map 生成单独的文件
inline-source-map 生成单独的map代码在js文件中
# scope hosting
开启后公用的模块成单独的函数,单独功能的直接内联进去
webpack4默认开启了
# 代码切割
npm i html-webpack-externals-plugin -D
const HtmlWebpackExternalsPlugin = require('html-webpack-externals-plugin')
# eslint
npm i eslint eslint-plugin-import eslint-plugin-react eslint-plugin-jsx-ally -D
npm i eslint-loader -D
npm i eslint-config-airbnb -D
# 打包组件或基础库
npm login
npm publish
nrm ls
nrm use **
加上prepublish 发布时自动执行命令打包
js压缩
mode设为none production模式自动会压缩
用TerserPlugin压缩
const TerserPlugin = require('terser-webpack-plugin')
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
include: /\.min\.js$/,
})
]
}
entry: {
'large-number': './src/index.js',
'large-number.min': './src/index.js', // 多页面打包
},
output: {
filename: '[name].js',
library: 'largeNumber',
libraryTarget: 'umd', // 使得各种引入语法都能用
libraryExport: 'default' // 使得不需要largeNumber.default才能调用
},
# 最大数和
export default function add(a, b) {
let i = a.length - 1;
let j = b.length - 1;
let carry = 0;
let ret = '';
while (i >= 0 || j >= 0) {
let x = 0;
let y = 0;
let sum;
if (i >= 0) {
x = a[i] - '0';
i--;
}
if (j >= 0) {
y = b[j] - '0';
j--;
}
sum = x + y + carry;
if (sum >= 10) {
carry = 1;
sum -= 10;
} else {
carry = 0;
}
ret = sum + ret;
}
if (carry) {
ret = carry + ret;
}
return ret;
}
# ssr
新建个webpack配置
去src下文件夹找服务端渲染的文件
启个node服务 将打包好的渲染文件载入,用个html模板占位符替换dom和数据
# 优化不需要日志
stats
stats: 'errors-only' 只报错
生产环境跟着写就是,开发环境要写到dev-server里去
更友好的方式
npm i friendly-errors-webpack-plugin -D
就是vue用的
# 错误捕获
echo $?
# 构建通用配置
npm i webpack-merge -D
npm i eslint eslint-config-airbnb-base babel-eslint -D
"eslint": "eslint ./lib --fix"
# 冒烟测试
npm i rimraf -D 移除dir
npm i mocha -D
npm i glob-all -D
# 单元测试
npm i assert -D 断言
npm i istanbul -D 测试覆盖率
# 持续集成
travis ci