# Webpack面试题
- 为什么要进行构建和打包?
- 体积更小(Tree-shaking,压缩、合并),加载更快
- 编译高级语言或语法(TS, ES6+,模块化,SCSS)
- 兼容性和错误检查(Polyfill, postcss, eslint)
- 统一的高效开发环境
- 统一构建流程和产出标准
- 集成公司构建规范
- module chunk bundle分别是什么 有何区别?
- module - 各个源码文件, webpack中一切皆模块
- chunk - 多模块合并的 如 entry import splitChunk
- bundle - 最终输出的文件
- loader和plugin的区别?
- loader 模块转化器,如less-->css
- plugin扩展插件 如 HtmlWebpackPlugin
- webpack如何实现懒加载
- import
- Vue React异步组件
- webpack 常见性能优化
- babel和webpack区别
- babel js的新语法编译工具,不关心模块化
- webpack 构建工具 是loader和plugin的集合
- bable-runtime和babel-polyfill的区别
# 基础配置
拆分和merge
webpack-merge webpack.common.js webpack.dev.js webpack.prd.js
devServer: {
open: true, // 自动打开浏览器
compress: true // 启动gzip
}
.babelrc
处理css //自右向左 ['style-loader','css-loader','postcss-loader']
处理image loader: 'file-loader' || 'url-loader'
(模块化)
# 高级配置
- 多入口
entry: {
index: path.join(srcPath, 'index.js'),
other: path.join(srcPath, 'other.js')
}
plugins: [
new HtmlWebpackPlugin({
template: path.join(srcPath, 'index.html'),
filename: 'index.html',
chunks: ['index'],
// chunks: ['index', 'vendor', 'chunk']
}),
new HtmlWebpackPlugin({
template: path.join(srcPath, 'other.html'),
filename: 'other.html',
chunks: ['other']
}),
]
- 抽离css build-min-extract-css. mini-css-extract
optimization {
minimizer: [
new TerserJSPlugin({}),
new OptimizeCSSAssetsPlugin()
]
}
- 抽离公共代码《bulid-split-chunks》
optimization: {
splitChunks: {
chunks: 'all',
// initial 入口chunk 对于异步文件不处理
// async 异步chunk 只对异步导入的文件处理
// all 全部 chunk
cacheGroups: {
// 第三方模块
vendor: {
name: 'vendor',
priority: 1,
test: 'node_modules',
minSize: 0,
minChunks: 1, // 最少复用几次
},
// 公共的模块
common: {
name: 'common',
priority: 0,
minSize: 0,
minChunks: 2 // 公共模块最少复用几次
}
}
}
}
- 懒加载
import('./xxx.js').then(res => { console.log(res.default.xxx) })
- 处理jsx { "presets": ["@babel/preset-react"] }
- 处理vue { test: '.vue$'/, loader: ['vue-loader'], include: 'src' }
# 优化打包效率
- 优化babel-loader
开启缓存 明确范围 use include
IgnorePlugin
noParse
happyPack(多进程打包)
- JS单线程,开启多进程打包
- 提高构建速度(特别是多个CPU)
- https://github.com/amireh/happypack
ParallelUglifyPlugin(多进程压缩JS)
- webpack内置的Uglify工具压缩JS
- JS单线程,开启多进程压缩更快
- 和HappyPack同理
关于开启多进程
- 项目较大,打包慢,开启多进程能提高速度
- 项目小,打包快。开启多进程反而降低速度(进程开销)
自动刷新
- watch设置true
- 配置devServer (webpack-dev-server)
热更新(HotModuleReplacementPlugin)
- 自动刷新 整个页面会更新,速度会变慢
- 整个页面的状态丢失 尤其是form表单数据
- 热更新不会
entry: { index: [ 'webpack-dev-server/client?http://localhost:8080/', 'webpack/hot/dev-server', path.join('src','other.js') ] }
DllPlugin(动态链接库插件)
- 前端框架 vue React 体积大 构建慢
- 较稳定 不常升级版本
- 同一版本只构建一次 不重复构建
- webpack内置 DllPlugin
- 打包出Dll文件
- DllReferencePlugin - 使用dll文件
- 配置webpack.dll.js文件
# 优化产出代码 (生产环境)
- babel-loader
- IgnorePlugin
- noParse
- happyPack
- ParallelUglifyPlugin
# 不可以用生产环境
- 自动刷新
- 热更新
- DllPlugin
# webpack性能优化--产出代码
- 体积更小
- 合理分包 不重复加载
- 速度更快 内存使用更少
小图谱base64
bundle加hash
懒加载
提取公共代码
IngorePlugin
使用CDN
使用production
- 自动压缩代码
- 自动删除调试代码(如warning)
- 启动Tree-Shaking // ES6 module才可以 commonjs不行
关于ES6 Module和Commonjs的区别
- ES6 module 静态引入,编译时引入
- Commonjs动态引入,执行时引
- ES6 module才能静态分析 实现tree-shaking
Scope Hosting(作用域)
# 构建流程概述
# babel
- 环境搭建 && 基本配置
- .babelrc配置
- presets 和 plugins // presets是plugins的集合
- https://www.babeljs.cn/docs/presets
- babel-polyfill(babel7.4-已经废弃)
- core-js和regenerator两者集合
- core-js 适配低版本的浏览器
- regenerator 支持generator
- babel-runtime
- 不污染全局环境
关注公众号
组队学习,一同成长 
扫码添加好友
备注 加群学习 