转载自掘进@无敌UFO
从基础到实战 手摸手带你掌握新版Webpack4.0详解
知识点概览:
Loader,HMR ,Create React App, Caching,
Plugin, SourceMap,Vue Cli 3.0 ,Shimming,
WebpackDevServer,TreeShaking, CodeSplitting,
Babel, React , Library, Eslint ,PWA,
Vue, Mode,性能优化,多页应用,原理,
PreLoading, PreFetching ,环境变量,TypeScript
收获:
彻底学会Webpack的配置
理解 Webpack的作用及原理
上手项目的打包过程配置
拥有工程化的前端思维
步入高级前端工程师行列
一:初识Webpack
官网图镇楼:

1. 1 什么是WebPack
webpack 是一个现代 JavaScript 应用程序的静态模块打包工具:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并生成一个或多个 bundle,将其打包为合适的格式以供浏览器使用。
webpack构建:
构建就是把源代码转换成发布到线上的可执行 JavaScrip、CSS、HTML 代码,包括如下内容。
1.代码转换:TypeScript 编译成 JavaScript、SCSS或Less 编译成 CSS 等。
2.文件优化:压缩 JavaScript、CSS、HTML 代码,压缩合并图片等。
3.代码分割:提取多个页面的公共代码、提取首屏不需要执行部分的代码让其异步加载。
4.模块合并:在采用模块化的项目里会有很多个模块和文件,需要构建功能把模块分类合并成一个文件。
5.自动刷新:监听本地源代码的变化,自动重新构建、刷新浏览器,nodemon。
6.代码校验:在代码被提交到仓库前需要校验代码是否符合规范,以及单元测试是否通过。
7.自动发布:更新完代码后,自动构建出线上发布代码并传输给发布系统。
构建其实是工程化、自动化思想在前端开发中的体现,把一系列流程用代码去实现,让代码自动化地执行这一系列复杂的流程。 构建给前端开发注入了更大的活力,解放了我们的生产力,更加方便了我们的开发。
1.2 什么是 webpack 模块
CommonJS
require()语句AMD
define和require语句css/sass/less 文件中的
@import语句。样式(
url(...))或 HTML 文件(<img src=...>)中的图片链接
1.3 搭建Webpack环境
去官网下载node
1
2
3
4// 查看node版本号
node -v
// 查看npm版本号
npm -v
1.4 初始化项目
1 | mkdir webpack-productname |
1.5 安装webpack
1 | //全局安装(不推荐),因为如果有两个项目用了webpack不同版本,就会出现版本不统一运行不起来的情况。只有卸了当前版本安装对应版本非常麻烦。 |
1 | //在项目里安装webpack(推荐使用)。可以在不同项目中使用不同的webpack版本。 |
注意:
由于npm安装走的是国外的网络,比较慢容易出现安装失败的现象。
可以用yarn安装,首先得全局安装yarn,
npm install yarn -g。或使用nrm快速切换npm源,首先得全局安装nrm,
npm install -g nrm。nrm 使用:
nrm ls 查看可选源。
nrm test npm 测试速度。看哪个快就use哪个。
nrm use cnpm 使用cnpm 。
webpack-cli:使我们们可以在命令行里正确的使用webpack
1.6 webpack的配置文件
webpack 开箱即用,可以无需使用任何配置文件。然而,webpack 会假定项目的入口起点为 src/index,然后会在 dist/main.js 输出结果,并且在生产环境开启压缩和优化。通常,你的项目还需要继续扩展此能力,为此你可以在项目根目录下创建一个 webpack.config.js 文件,webpack 会自动使用它。
在项目根目录下创建 webpack.config.js 文件,这是webpack默认配置文件
1 | const path = require('path') |
也可以自己指定配置文件来完成webpack的打包:
1 | npx webpack --config + 自定义配置文件 |
1.7 webpack打包输出内容
1 | 执行 `npm run build` 后,在控制台输出 |
二:Webpack核心概念
LOADER
2.1 什么是Loader
webpack可以使用 loader 来预处理文件,就是通过使用不同的Loader,webpack可以把不同的静态文件都编译成js文件,比如css,sass,less,ES6/7,vue,JSX等。
使用Loader打包静态资源
支持加载图片文件:
需要安装 file-loader:解决CSS等文件中的引入图片路径问题
1 | npm install file-loader -D |
在 webpack.config.js 里添加 loader 配置
1 | module.exports = { |
详细请看官方文档:file-loader
将小图片转换成base64格式
需要安装 url-loader:当图片小于limit的时候会把图片BASE64编码,大于limit参数的时候还是使用file-loader 进行拷贝
1 | npm install url-loader -D |
在 webpack.config.js 里添加 loader 配置
1 | module.exports = { |
详细请看官方文档:url-loader
支持加载样式CSS文件:
需要安装 css-loader style-loader:
1 | npm install css-loader style-loader -D |
在 webpack.config.js 里添加 loader 配置
1 | module.exports = { |
支持加载样式SASS文件:
需要安装 sass-loader node-sass:
1 | npm install sass-loader node-sass -D |
在 webpack.config.js 里添加 loader 配置
1 | module.exports = { |
为 css 样式属性加不同浏览器的前缀
为了浏览器的兼容性,有时候我们必须加入-webkit,-ms,-o,-moz这些前缀
- Trident内核:主要代表为IE浏览器, 前缀为-ms
- Gecko内核:主要代表为Firefox, 前缀为-moz
- Presto内核:主要代表为Opera, 前缀为-o
- Webkit内核:产要代表为Chrome和Safari, 前缀为-webkit
1 | npm i postcss-loader autoprefixer -D |
在项目跟目录下创建 postcss.config.js
1 | module.exports = { |
webpack.config.js
1 | module.exports = { |
给loader加一些配置项:
webpack.config.js
1 | module.exports = { |
为字体图标文件配loader
在 阿里巴巴矢量图标库中,把需要的字体图标下载到本地,解压。将iconfont.eot iconfont.svg iconfont.ttf iconfont.woff 文件放入到项目中,在src中新建一个放字体图标的文件夹font。将iconfont.css文件拷贝到项目中,自己改一下引入字体图标的路径。
需要安装 file-loader:
1 | npm i file-loader -D |
webpack.config.js
1 | module.exports = { |
详细请看官方文档:asset-management
plugin : 可以在webpack运行到某个时刻的时候,帮你做一些事情
使用plugins让打包更便捷
HtmlWebpackPlugin :htmlWebpackPlugin 会在打包结束后,自动生成一个html文件,并把打包生成的js自动引入到这个html文件中
安装:npm i html-webpack-plugin -D
基本用法:在 webpack.config.js 中:
1 | const HtmlWebpackPlugin = require('html-webpack-plugin'); |
CleanWebpackPlugin :自动清除上一次打包的dist文件
安装:npm i clean-webpack-plugin -D
基本用法:在 webpack.config.js 中:
1 | const HtmlWebpackPlugin = require('html-webpack-plugin'); |
Entry与Output的基础配置
在打包多入口文件时的配置
基本用法:在 webpack.config.js 中:
1 | const HtmlWebpackPlugin = require('html-webpack-plugin'); |
详细请看官网:Output output-management
SourceMap 的配置
sourcemap:打包编译后的文件和源文件的映射关系,用于开发者调试用。
source-map 把映射文件生成到单独的文件,最完整但最慢
cheap-module-source-map 在一个单独的文件中产生一个不带列映射的Map
eval-source-map 使用eval打包源文件模块,在同一个文件中生成完整sourcemap
cheap-module-eval-source-map sourcemap和打包后的JS同行显示,没有映射列
development环境推荐使用: devtool: ‘cheap-module-eval-source-map’,
production环境推荐使用: devtool: ‘cheap-module-source-map’,
webpack.config.js
1 | const path = require('path'); |
详细请看官网:devtool
使用WebpackDevServer 提升开发效率
解决每次在src里编写完代码都需要手动重新运行 npm run dev
1.在 package.json 中配置
1 | { |
2.在 webpack.config.js 中,加 devServer
安装 npm i webpack-dev-server –D
- contentBase :配置开发服务运行时的文件根目录
- open :自动打开浏览器
- host:开发服务器监听的主机地址
- compress :开发服务器是否启动gzip等压缩
- port:开发服务器监听的端口
1 | const path = require('path'); |
在 package.json 中:
1 | { |
详细请看官网 :dev-server
扩充知识:自己写一个类似webpackdevserver的工具
了解即可,功能不全,自行扩展。
在 package.json 中:
1 | { |
安装 :npm i express webpack-dev-middleware -D
在 项目根目录下创建 server.js 文件
在 server.js 中
1 | const express = require('express'); |
模块热替换(hot module replacement)
在 package.json 中:
1 | { |
在 webpack.config.js 中
1 | const path = require('path'); |
index.js
1 | //如果模块启用了HMR,就可以用 module.hot.accept(),监听模块的更新。 |
注意点:
引入css,用框架Vue,React 时,不需要写 module.hot.accept(),因为在使用css-loader,vue-loader,babel-preset时,就已经配置好了HMR,不需要自己写
详细请看官方文档:hot-module-replacement api/hot-module-replacement concepts/hot-module-replacement
使用 Babel 处理 ES6/7 语法 转义为ES5
BABEL官网:https://babeljs.io/setup
安装依赖包:
1 | npm i babel-loader @babel/core @babel/preset-env -D |
在 webpack.config.js 中
1 | module: { |
在 index.js 中:
1 | //在业务代码运行之前最顶部导入 |
注意:在开发类库,第三方模块或组件库时不能用 @babel/polyfill 这种方案,因为会把声明的变量变成全局变量,会污染全局环境。
安装:
1 | npm install --save-dev @babel/plugin-transform-runtime |
在 webpack.config.js 中
1 | module: { |
由于babel需要配置的内容非常多,我们需要在项目根目录下创建一个 .babelrc 文件。
就不需要在 webpack.config.js 中写 babel 的配置了。
在 .babelrc 中:
1 | { |
配置 React 代码的打包
业务代码:
在 .babelrc 中:
1 | { |
安装:
1 | npm i react react-dom --save |
详细内容请看官网:babel-loader
三:Webpack进阶
Tree Shaking:只支持 ES Module 例如 import 和 export 的静态结构特性的引入。当引入一个模块时,不引入所有的代码,只引入需要的代码
在 webpack.config.js 中:
1 | const path = require('path'); |
在 package.json 中:
1 | { |
详细内容请看官网:tree-shaking
Develoment 和Production模式的区分打包
在项目根目录下创建两个文件,webpack.dev.js,webpack.prod.js
webpack.dev.js
1 | const path = require('path'); |
webpack.prod.js
1 | const path = require('path'); |
在 package.json 中:
1 | { |
解决 webpack.dev.js,webpack.prod.js 存在大量重复代码,在项目根目录下创建一个 webpack.common.js 文件,把公共代码提取出来
安装 :
1 | npm i webpack-merge -D |
webpack.common.js
1 | const path = require('path'); |
webpack.dev.js
1 | const webpack = require('webpack'); |
webpack.prod.js
1 | const merge = require('webpack-merge') |
最后在根目录下创建一个build文件夹,将 webpack.common.js , webpack.dev.js ,webpack.prod.js 放在build文件夹下,统一管理。
在 package.json 中:
1 | { |
详细请看官网文档:guides/production
Webpack和Code Splitting
安装: npm i lodash --save npm i babel-plugin-dynamic-import-webpack -D
代码分割,和webpack无关,为了提升性能
webpack中实现代码分割,两种方式:
第一种方法:同步代码: 只需要在webpack.common.js中做optimization的配置即可
第二种方法:异步代码(import): 异步代码,无需做任何配置,会自动进行代码分割,放置到新的文件中
第一种方法:在 webpack.common.js 中
1 |
|
第二种方法在 .babelrc 中:
1 | { |
详细内容请看官网:code-splitting
SplitChunksPlugin 配置参数详解
安装:npm install --save-dev @babeL/plugin-syntax-dynamic-import
在业务 index.js 中:
1 |
|
在 .babelrc 中:
1 | { |
在 webpack.common.js 中:
1 |
|
详细请看官方文档:split-chunks-plugin
Lazy Loading 懒加载,Chunk是什么?
用户当前需要用什么功能就只加载这个功能对应的代码,也就是所谓的按需加载 在给单页应用做按需加载优化时,一般采用以下原则:
- 对网站功能进行划分,每一类一个chunk
- 对于首次打开页面需要的功能直接加载,尽快展示给用户
- 某些依赖大量代码的功能点可以按需加载
- 被分割出去的代码需要一个按需加载的时机
每一个文件就是一个 chunk
详细请看官方文档:lazy-loading
打包分析,Preloading,Prefetching
打开网址:webpack分析工具:https://github.com/webpack/analyse
在 package.json 中
1 | { |
在控制台运行 npm run dev-build ,在根目录下生成 stats.json 文件。打开网址 http://webpack.github.io/analyse/ ,把stats.json文件传上去,会出现分析结果。
详细请看官方文档:bundle-analysis 打包分析工具
介绍 webpack-bundle-analyzer 的使用:
通过使用webpack-bundle-analyzer可以看到项目各模块的大小,可以按需优化。
官网图镇楼:

安装:
1 | # NPM |
配置:在 webpack.config.js 中:
1 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; |
输出:在 package.json 中:
1 | "analyz": "NODE_ENV=production npm_config_report=true npm run build" |
在线分析:在 控制台输入:
1 | webpack --profile --json > stats.json |
- profile:记录下构建过程中的耗时信息;
- json:以 JSON 的格式输出构建结果,最后只输出一个 .json 文件,这个文件中包括所有构建相关的信息。
- Webpack 官方提供了一个可视化分析工具 Webpack Analyse
- Modules:展示所有的模块,每个模块对应一个文件。并且还包含所有模块之间的依赖关系图、模块路径、模块ID、模块所属 Chunk、模块大小;
- Chunks:展示所有的代码块,一个代码块中包含多个模块。并且还包含代码块的ID、名称、大小、每个代码块包含的模块数量,以及代码块之间的依赖关系图;
- Assets:展示所有输出的文件资源,包括 .js、.css、图片等。并且还包括文件名称、大小、该文件来自哪个代码块;
- Warnings:展示构建过程中出现的所有警告信息;
- Errors:展示构建过程中出现的所有错误信息;
- Hints:展示处理每个模块的过程中的耗时。
打开谷歌控制台查看代码使用率,按 ctrl+shift+p ,输入 coverage 查看。
预取/预加载模块(prefetch/preload module)
假如有一个HomePage组件,其内部有一个LoginButton.js登陆组件,再点击后按需加载 LoginModel 组件。
LoginButton.js:
1 | import(/* webpackPrefetch: true */ 'LoginModal'); |
这会生成 <link rel="prefetch" href="login-modal-chunk.js"> 并追加到页面头部,指示着浏览器在闲置时间预取 login-modal-chunk.js 文件。就是说,只要首页加载完成,就会在空闲时间把登录模块也加载了。
总结:
/ webpackPrefetch: true /:把主加载流程加载完毕,在空闲时在加载其他,等再点击其他时,只需要从缓存中读取即可,性能更好。推荐使用,提高代码利用率。把一些交互后才能用到的代码写到异步组件里,通过懒加载的形式,去把这块的代码逻辑加载进来,性能提升,页面访问速度更快。
/ webpackPreload: true /: 和主加载流程一起并行加载。
详细请看官方文档:prefetchingpreloading-modules
CSS文件的代码分割
在 webpack.config.js 中
1 | module.exports = { |
因为CSS的下载和JS可以并行,当一个HTML文件很大的时候,我们可以把CSS单独提取出来加载
- mini-css-extract-plugin:一般在线上环境使用这个插件,因为在开发环境中不支持HMR。
- filename 打包入口文件
- chunkFilename 用来打包
import('module')方法中引入的模块
安装 :
1 | //抽离css文件 |
在 webpack.prod.js 中:
1 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); |
在 webpack.dev.js
1 | const webpack = require('webpack'); |
在 webpack.common.js 中:
1 | const path = require('path'); |
在 package.json 中:
1 | { |
详细请看官方文档:mini-css-extract-plugin
Webpack 与浏览器缓存(Caching)
在 webpack.common.js 中:
1 | const path = require('path'); |
在 webpack.dev.js 中:
1 | const webpack = require('webpack'); |
在 webpack.prod.js 中:
1 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); |
详细请看官网文档:manifest
Shimming (垫片)
在 webpack.common.js 中:
1 | const path = require('path'); |
如果想让每个js模块的this都指向window:
安装: npm install imports-loader -D
在 webpack.common.js 中:
1 | const path = require('path'); |
详细请看官方文档:imports-loader shimming
环境变量的使用
只需要一个common.js文件通过在package.json中传递不同的参数,区分是开发环境还是生产环境。
在 package.json 中:
1 | { |
在 webpack.common.js 中:
1 | const path = require('path'); |
在 webpack.dev.js 中:
1 | const webpack = require('webpack'); |
在webpack.prod.js 中:
1 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); |
四:Webpack实战配置案例
Library的打包:库代码通过webpack进行打包
仓库源码 【41】
在 webpack.config.js 中:
1 |
|
在 package.json 中:
1 | "main": "./dist/library.js", //最终要给别人使用的 |
在 npm 官网注册一个账号,在命令行输入 :
1 | //添加用户名和密码 |
详细请看官方文档:externals author-libraries
Progressive Web Application:在webpack中配置pwa
渐进式网络应用程序,PWA 可以用来做很多事。其中最重要的是,在离线(offline)时应用程序能够继续运行功能。这是通过使用名为 Service Workers 的 web 技术来实现的。线上环境时才用到pwa,开发时不需要
仓库源码 【42】
安装:
1 | //模拟服务器 |
在 package.json 中:
1 | "scripts": { |
线上环境时才用到pwa,开发时不需要,只需要改 webpack.prod.js ,
在 webpack.prod.js 中:
1 | const WorkboxPlugin = require('workbox-webpack-plugin'); |
在业务代码 index.js 中使用pwa
1 | console.log('hello, haiyang'); |
详细请看官方文档:progressive-web-application
TypeScript 的打包配置
TypeScript 是 JavaScript 的超集,为其增加了类型系统,可以编译为普通 JavaScript 代码。这篇指南里我们将会学习是如何将 webpack 和 TypeScript 进行集成。
仓库源码 【43】
安装:
1 | npm install --save-dev typescript ts-loader |
在 webpack.config.js 中:
1 | const path = require('path'); |
在项目根目录下创建 tsconfig.json 文件:
1 | { |
在从 npm 安装 third party library(第三方库) 时,一定要记得同时安装此 library 的类型声明文件(typing definition)。你可以从 TypeSearch 中找到并安装这些第三方库的类型声明文件。在使用时,哪有错可以有警告提示,方便改错。
安装:
1 | //在typescript里用loadah |
详细请看官方文档:typescript
使用 WebpackDevServer 实现请求转发
仓库源码 【44】
安装:
1 | //向服务器发送axios请求 |
在 index.js 中:
1 | componentDidMount() { |
在 webpack.config.js 中:
1 | devServer: { |
详细请看官方文档:devserverproxy
WebpackDevServer 解决单页面应用路由问题
仓库源码 【45】
安装:
1 | npm i react-router-dom --save |
在 webpack.config.js 中:
1 | devServer: {//配置只在开发时有效,上线时后端也需配置 |
详细请看官方文档:devserverhistoryapifallback
EsLint 在 Webpack 中的配置
仓库源码 【46】
安装:
1 | //安装eslint工具,规范项目中的代码 |
1 | //快速生成eslint配置 |
在 .eslintrc.js 中:
1 | module.exports = { |
详细请看官方文档:eslint
在 vscode 编辑器里安装 eslint 插件,自动检测语法错误。(推荐使用)
在 webpack.config.js 中:
1 | devServer: { |
在真实项目中,也可以不在webpack 中配置eslint,在提交git仓库时,git 钩子 eslint src 。但是没有图形交互式的错误提示。
详细请看官方文档:eslint-loader
提升 webpack 打包速度的方法
仓库源码 【47】
1.跟上技术的迭代(Node,Npm,Yarn)
2.在尽可能少的模块上应用 Loader
3.Plugin 尽可能精简并确保可靠
4.resolve 参数合理配置
仓库源码 【48】
引入资源文件写后缀,像 图片文件(.jpg, .png, .svg),逻辑代码配置在extensions中:extensions: [‘.js’, ‘.jsx’]
5.使用 DLLPlugin 提高打包速度
详细请看官方文档:dll-plugin
仓库源码 【49】
实现第三方模块只打包一次
安装:
1 | npm i add-asset-html-webpack-plugin --save |
在 build 文件夹里创建 webpack.dll.js 文件:把第三方模块单独进行打包,生成一个vendors.dll.js 文件,所有的第三方模块都在这个文件里。
1 | const path = require('path'); |
在 webpack.common.js 中:
1 | const AddAssetHtmlWebpackPlugin = require('add-asset-html-webpack-plugin'); |
在 package.json 中 添加一个脚本:1
2
3
4
5
6"scripts": {
"dev-build": "webpack --config ./build/webpack.dev.js",
"dev": "webpack-dev-server --config ./build/webpack.dev.js",
"build": "webpack --config ./build/webpack.prod.js",
+ "build:dll": "webpack --config ./build/webpack.dll.js"
}
在 控制台 先 执行 npm run build:dll 生成对应的 XXX.dll.js 和 XXX.manifest.json 文件。以后再执行 npm run build 或 npm run dev 时,就不用再node_modules查找对应模块进行分析,直接用打包好的 XXX.dll.js就可以,节省打包速度。
总结:
如果不使用使用 DLLPlugin 插件,当引入第三方模块时,每一次打包都要进行分析,是消耗打包的性能的。使用 DLLPlugin 提高打包速度,在第一次打包时,把第三方模块单独打包生成一个文件 vendors.dll.js ,之后在打包时就可以直接从 vendors.dll.js 中引入之前打包好的第三方模块,速度就会变快。
要想实现,就得做一些配置:
先配置 webpack.dll.js 文件,在配置 webpack.common.js 文件
==============================================================
.dll 为后缀的文件称为动态链接库,在一个动态链接库中可以包含给其他模块调用的函数和数据
- 把基础模块独立出来打包到单独的动态连接库里
- 当需要导入的模块在动态连接库里的时候,模块不能再次被打包,而是去动态连接库里获取 dll-plugin
定义Dll
- DllPlugin插件: 用于打包出一个个动态连接库
- DllReferencePlugin: 在配置文件中引入DllPlugin插件打包好的动态连接库
在 webpack.dll.js 中:
1 | module.exports = { |
1 | webpack --config webpack.dll.config.js --mode production |
使用动态链接库文件
在 webpack.common.js 中:
1 | plugins: [ |
1 | webpack --config webpack.config.js --mode development |
==============================================================
6.控制包文件大小
配置 Tree shaking,把用不到的代码去除掉。配置 SplitChunksPlugin。
7.thread-loader,parallel-webpack,happypack 多进程打包
HappyPack
HappyPack就能让Webpack把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程。 happypack
安装:npm i happypack@next -D
配置:
1 | module: { |
1 | plugins: [ |
ParallelUglifyPlugin
ParallelUglifyPlugin可以把对JS文件的串行压缩变为开启多个子进程并行执行
安装:npm i -D webpack-parallel-uglify-plugin
配置:
1 | new ParallelUglifyPlugin({ |
8.合理使用 sourceMap
9.结合 stats 分析打包结果
10. 开发环境内存编译
11.开发环境无用插件剔除
多页面打包配置
配置多个 entry 里的 html 页面,用HtmlWebpackPlugin 插件,将打包好的j多个js分别插入到对应的html页面中。
仓库源码 【410】
在 webpack.common.js 中:
1 | const path = require('path'); |
五:Webpack底层原理及脚手架工具分析
如何编写一个 Loader
仓库源码 【51】
1 | mkdir make-loader |
在根目录下创建文件夹loaders,里面创建自己定义的loader.js文件
在 webpack.config.js 中:
1 | const path = require('path'); |
详细请看官方文档:loaders#thisquery hiscallback thisasync
如何编写一个 Plugin
仓库源码 【52】
详细请看官方文档:compiler-hooks
Bundler 源码编写(模块分析)
应对 webpack 原理面试必备:
仓库源码 【53】
安装 :
1 | //高亮显示代码的工具 |
Bundler 源码编写(Dependencies Graph)
仓库源码 【54】
Bundler 源码编写(生成代码)
仓库源码 【55】
六:Create-React-App 和 Vue-Cli 3.0脚手架工具配置分析
通过CreateReactApp深入学习Webpack配置
仓库源码 【56】
详细请看官方文档:CreateReactApp
快速开始:
1 | npx create-react-app my-app |
把隐藏的配置项展现出来:不可逆操作
1 | npm run eject |
就会多出来两个文件夹,config,scripts文件夹
Vue-Cli 3.0
仓库源码 【57】