babel和webpack的区别?
- babel:JS新语法编译工具,不关心模块化
wepack:打包构建工具,是多个loader、plugin的集合
Webpack
1、在dev模式下,启动本地服务,设置接口请求代理
2、使用babel-loader处理ES6,配合.babelrc的presets引入默认的plugins集合
3、sass-loader、postcss-loader、css-loader、style-loader
4、在prod模式下,使用url-loader,按图片大小(5kb)处理,内联的base64格式;并结合CDN
5、在prod模式下 ,在entry中配置多入口,结合output(包括命名的hash),最终在plugins中塞入html中
6、每次prod下,都需要cleanWebpackPlugin
7、抽离压缩css文件,使用mini-css-extract-plugin在rules中使用MiniCssExtractPlugin.loader,
- 在plulgins中抽离,使用MiniCssExtractPlugin,并制定hash命名和文件所处地址
- 在optimization中压缩
8、抽离公共代码和第三方代码
- 在optimization中,分割代码(splitChunks)
- 对于第三方,需要test来命中是否路径,并且优点判断
- 对于公共代码,则需要判断复用次数。(至少2次)
- 并在HtmlwebpackPlugin中决定引入哪些chunk
9、webpack默认支持异步懒加载
- import()
10、对于JSX的解析
- vue使用vue-loader
- react则是在babel中配置@babel/preset-react
优化构建速度
用于生产环境
1、在rules中开启babel缓存
2、用IgnorePlugin忽略无用文件,像是多语言
3、noParse避免重复打包,像是vue.mini.js这样mini.js结尾的文件
4、在plugins中使用happypack开启多进程,结合ParallelUglifyPlugin并行压缩
不用于生产环境
5、在devServer中配置自动刷新,watch:true,并配置watchOptions
6、在pulgins中配置热更新,在代码中需要if(module.hot)判断 & module.hot.accept回调
7、动态链接库插件(DllPlugin),针对稳定的、体积大的第三方库
babel-polyfill()
babel-runtime(不会污染全局;做lib)
基本配置
在package.json中的写法
"scripts": {
"devBuild": "webpack --config build/webpack.dev.js",
"dev": "webpack-dev-server --config build/webpack.dev.js",
"build": "webpack --config build/webpack.prod.js"
},
一般会将配置分为三类
- common:作为公共配置,结合
const { smart } = require('webpack-merge')
在dev和prod中merge - dev:配置devServer
- prod:
使用webpack-dev-server启动本地服务,可以设置代理
module chunk bundle 的区别
module(模块):多个源码文件,webpack中一切皆模块(只要可以引入的)
chunk:多模块合并成的(还在内存中),如entry、import()、splitChunk
bundle:最终的输出文件