development 环境参考配置: 'cheap-module-eval-source-map'
production 环境参考配置: 'cheap-module-source-map'
webpack-dev-server
webpack-dev-server 提供了一个简单的 web 服务器,并且能够实时重新加载(live reloading)。具体可参考https://www.webpackjs.com/guides/development/#%E4%BD%BF%E7%94%A8-webpack-dev-server
接口代理(请求转发)
如果你有单独的后端开发服务器 API,并且希望在同域名下发送 API 请求 ,那么代理某些 URL 会很有用。dev-server 使用了非常强大的 http-proxy-middleware 包。常用于接口请求转发。具体参考https://www.webpackjs.com/configuration/dev-server/#devserver-proxy
引言
webpack5 预计会在 2020 年年初发布,之前从 alpha 版本就有关注,本次重点更新在长期缓存,tree shakking 和 es6 打包这块。具体变更可以参考https://github.com/webpack/changelog-v5/blob/master/README.md。
webpack 是现代前端开发中最火的模块打包工具,只需要通过简单的配置,便可以完成模块的加载和打包。那它是怎么做到通过对一些插件的配置,便可以轻松实现对代码的构建呢?
本篇文章不会去探讨 webpack5 中所要更新的内容,我相信大多数前端同学对于 webpack 只是会简单的配置,而且现在像 vue-cli、umi 等对于 webpack 都有很好的封装,但其实这样对于我们自己是不太好的。尤其是想针对业务场景去做一些个性化的定制时。只有对 webpack 中的细节足够了解,我们才能游刃有余,本文将从 webpack 现有的大版本 webpack4,带你一步步打造极致的前端开发环境。
安装 webpack 的几种方式
global
(全局):通过webpack index.js
运行local
(项目维度安装):通过npx webpack index.js
运行避免全局安装 webpack(针对多个项目采用不同的 webpack 版本进行打包的场景),可采用
npx
entry(入口)
单一入口
output(输出)
默认配置
多个入口起点
高级进阶
loaders
file-loader
url-loader
css-loader
style-loader
sass-loader
安装
yarn add sass-loader node-sass webpack --dev
postcss-loader
https://blog.csdn.net/u014628388/article/details/82593185
plugins
HtmlWebpackPlugin
clean-webpack-plugin
https://blog.csdn.net/qq_23521659/article/details/88353708
SplitChunksPlugin
https://juejin.im/post/5af15e895188256715479a9a
MiniCssExtractPlugin
OptimizeCSSAssetsPlugin
devtool
source map
'cheap-module-eval-source-map'
'cheap-module-source-map'
webpack-dev-server
接口代理(请求转发)
解决单页面路由问题
通过传入一个对象,比如使用 rewrites 这个选项,此行为可进一步地控制:
webpack-dev-middleware
Hot Module Replacement
如果已经通过 HotModuleReplacementPlugin 启用了模块热替换(Hot Module Replacement),则它的接口将被暴露在 module.hot 属性下面。通常,用户先要检查这个接口是否可访问,然后再开始使用它。
bundle 分析
webpack-chart
: webpack 数据交互饼图webpack-visualizer
: 可视化并分析你的 bundle,检查哪些模块占用空间,哪些可能是重复使用的webpack-bundle-analyzer
: 一款分析 bundle 内容的插件及 CLI 工具,以便捷的、交互式、可缩放的树状图形式展现给用户Preloading、Prefetching
babel
babel 编译 es6、jsx 等
新建.babelrc 文件
按需引入 polyfill
在 src 下的 index.js 中全局引入@babel/polyfill 并写入 es6 语法,但是这样有一个缺点: 全局引入@babel/polyfill 的这种方式可能会导入代码中不需要的 polyfill,从而使打包体积更大,修改.babelrc 配置
这就配置好了按需引入。配置了按需引入 polyfill 后,用到 es6 以上的函数,babel 会自动导入相关的 polyfill,这样能大大减少打包编译后的体积。
babel-runtime 和 babel-polyfill 的区别
高级概念
tree shaking(js)
Code Spliting
@babel/plugin-syntax-dynamic-import
包)Caching(缓存)
Shimming
环境变量
使用环境变量必须对 webpack 配置进行一项更改。通常,module.exports 指向配置对象。要使用该 env 变量,必须转换 module.exports 为函数:
library 打包配置
我们打包的 library 中可能会用到一些第三方库,诸如 lodash。现在,如果执行 webpack,你会发现创建了一个非常巨大的文件。如果你查看这个文件,会看到 lodash 也被打包到代码中。在这种场景中,我们更倾向于把 lodash 当作 peerDependency。也就是说,用户应该已经将 lodash 安装好。因此,你可以放弃对外部 library 的控制,而是将控制权让给使用 library 的用户。这可以使用 externals 配置来完成:
对于用途广泛的 library,我们希望它能够兼容不同的环境,例如 CommonJS,AMD,Node.js 或者作为一个全局变量。为了让你的 library 能够在各种用户环境(consumption)中可用,需要在 output 中添加 library 属性:
当你在 import 引入模块时,这可以将你的 library bundle 暴露为名为 webpackNumbers 的全局变量。为了让 library 和其他环境兼容,还需要在配置文件中添加 libraryTarget 属性。这是可以控制 library 如何以不同方式暴露的选项。
我们还需要通过设置 package.json 中的 main 字段,添加生成 bundle 的文件路径。
PWA 打包配置
webpack.config.js
注册 Service Worker
现在来进行测试。停止服务器并刷新页面。如果浏览器能够支持 Service Worker,你应该可以看到你的应用程序还在正常运行。然而,服务器已经停止了服务,此刻是 Service Worker 在提供服务。
TypeScript 打包配置
npm install --save-dev typescript ts-loader
npm install --save-dev @types/lodash
webpack 性能优化
https://www.webpackjs.com/configuration/resolve/
)stats.json
分析打包结果(bundle analyze)最后
你可以关注我的同名公众号【前端森林】,这里我会定期发一些大前端相关的前沿文章和日常开发过程中的实战总结。当然,我也是开源社区的积极贡献者,github地址
https://github.com/Jack-cool
,欢迎star!!!