前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
  • 基础篇

    • 环境搭建
    • node部署
    • 基础应用
  • 内置模块

    • 1.0 本地路径处理 path
    • 2.0 文件系统操作 fs
    • 3.1 基础调试 console
    • 3.2 本地调试远程服务器上的Node代码
    • 4.1 网络服务 http
    • 4.2 网络服务 http res
    • 4.3 网络服务 http req
    • 4.4 网络服务 http server
    • 4.5 网络服务 http client
    • 4.6 网络服务 https
    • 4.7 网络TCP net
    • 4.8 网络UDP dgram
    • 4.9 域名解析 dns
    • 5.0 网络地址解析 url
    • 5.1 URL查询字符串 querystring
    • 6.1 流操作 stream
    • 6.2 逐行读取 readline
    • 7.1 进程相关 process
    • 7.2 子进程 child
    • 8.1 二进制数据 buffer
    • 8.2 二进制解码 string_decoder
    • 9.1 事件机制 events
    • 9.2 实用工具模块 util
    • 9.3 数据加密 crypto
    • 9.4 MD5入门介绍及crypto模块的应用
    • 9.4 资源压缩 zlib
    • 9.5 集群 cluster
    • 9.6 v8
  • 进阶篇

    • 5分钟入门非对称加密用法
    • cluster
    • cookie_parser深入
    • crypto模块之理论篇
    • express+cookie_parser签名机制深入剖析
    • express+session实现简易身份认证
    • https
    • log4js入门实例
    • node8_napi
    • 使用 async 控制并发
    • 使用 eventproxy 控制并发
    • 使用 superagent 与 cheerio 完成简单爬虫
    • 基于express+muter的文件上传
    • 将图片转成datauri嵌入到html
    • 常用中间件 body_parser 实现解析
    • 日志模块morgan
    • 服务端字符编解码&乱码处理 charset_enc_dec
    • 测试用例mocha,should,istanbul
    • 调试日志打印debug模块
  • Express

    • 1.1 Express概览篇
    • 1.2 Express
  • Koa2

    • 1.0 koa2概览篇
    • 1.1 快速开始
    • 1.2 async await使用
    • 1.3 koa2简析结构
    • 1.4 koa中间件开发与使用
    • 10.1 单元测试
    • 11.1 开发debug
    • 12.1 快速启动
    • 12.2 框架设计
    • 12.3 分层操作
    • 12.4 数据库设计
    • 12.5 路由设计
    • 12.6 webpack4环境搭建
    • 12.7 使用react
    • 12.8 登录注册功能实现
    • 12.9 session登录态判断处理
    • 13.1 import export使用
    • 2.1 原生koa2实现路由
    • 2.2 koa router中间
    • 3.1 GET请求数据获取
    • 3.2 POST请求数据获取
    • 3.3 koa bodyparser中间件
    • 4.1 原生koa2实现静态资源服务器
    • 4.2 koa static中间件
    • 5.1 koa2使用cookie
    • 5.2 koa2实现session
    • 6.1 koa2加载模板引擎
    • 6.2 ejs模板引擎
    • 7.1 busboy模块
    • 7.2 上传文件简单实现
    • 7.3 异步上传图片实现
    • 8.1 mysql模块
    • 8.2 async await封装使用mysql
    • 8.3 项目建表初始化
    • 9.1 原生koa2实现JSONP
    • 9.2 koa jsonp中间件
  • 其他

    • 操作数据库
    • Session 与 Token
    • Cookie、Session、Token、JWT
    • Socket

# webpack4 环境搭建

30 秒速记

  • 目标:把 JSX、ES6+、Less 编译成浏览器能直接跑的 JS 和 CSS
  • 配置拆三份:base 放共用的入口、loader、插件,dev 和 prod 用 webpack-merge 只写差异
  • Webpack 4 起要写 mode,不写会警告并按 production 处理
  • 构建命令写进 package.json 的 scripts,依赖装在项目里,别靠全局 webpack
  • Webpack 4 已不再维护,新项目直接上 Webpack 5 或 Vite,老项目按官方迁移指南升级

搭 Webpack 环境其实就是告诉它三件事:从哪个文件开始打包、遇到什么类型的文件用什么 loader 转换、最后输出到哪。 这个项目要编译 React 的 JSX、ES6+ 语法和 Less 样式,所以核心是 babel-loader 加一组样式 loader。配置我会拆成基础、开发、生产三份,开发要 source map 好调试,生产要压缩。另外说一句,Webpack 4 是 2018 年的版本,现在已经停止维护,学它的概念没问题,新项目我会直接用 Webpack 5 或者 Vite。

理解「webpack4 环境搭建」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 module 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

Webpack 可以理解成一个「翻译 + 打包」工具:它从入口文件出发,顺着 import / require 把依赖全部找出来,每种文件交给对应的 loader 翻译,最后合成几个浏览器能直接加载的文件。

这个项目的需求是:React 页面用 JSX 写、样式用 Less、组件库用 antd,所以需要的依赖大致是:

npm i -D webpack@4 webpack-cli@3 webpack-merge \
  babel-loader @babel/core @babel/preset-env @babel/preset-react \
  css-loader less less-loader postcss-loader mini-css-extract-plugin
npm i react react-dom antd
@前端进阶之旅: 代码已经复制到剪贴板

package.json 里把命令固定下来:

{
  "scripts": {
    "dev": "webpack --config static/build/webpack.dev.config.js --watch",
    "build": "webpack --config static/build/webpack.prod.config.js"
  }
}
@前端进阶之旅: 代码已经复制到剪贴板

配置拆成三份:webpack.base.config.js 写入口、输出、loader 这些共用部分;开发配置加 mode: 'development' 和 devtool: 'source-map';生产配置加 mode: 'production' 和压缩。开发和生产都通过 webpack-merge 继承基础配置,公共部分只改一处。

版本上要有数:Webpack 5 在 2020 年发布,Webpack 4 已经不再维护,很多 loader 的新版本也不再支持它。照着教程学概念没问题,真开新项目建议直接用 Webpack 5 或 Vite。

面试官追问

追问 1不写 mode 会怎样?
参考回答

Webpack 4 会给一个警告,然后按 production 处理,开发时打出来的代码是压缩过的,调试很痛苦。开发配置里显式写 mode: 'development',process.env.NODE_ENV 也会自动跟着设好。

追问 2为什么不建议用全局安装的 webpack?
参考回答

每台机器装的版本可能不一样,CI 上也不一定有,换台机器就跑不起来。装成项目的 devDependencies,命令写进 scripts,npm run build 用的就是 node_modules/.bin 里那个版本。

追问 3老项目还在 Webpack 4,升到 5 最容易踩哪些坑?
参考回答

Node 核心模块的 polyfill 没了,用到 Buffer、process 的要自己配 resolve.fallback;file-loader、url-loader 被内置的 asset modules 替代;一些插件要升大版本。按官方迁移指南一项项过,比一口气全升稳。

追问 4构建在 CI 上失败了,流水线却显示成功,可能是什么原因?
参考回答

多半是外层脚本把退出码吞了,比如 webpack || true,或者用 & 放后台跑。webpack 编译出错会以非零码退出,直接跑底层命令看 echo $? 就能确认。

# webpack4 环境搭建

# 前言

30 秒速记

  • 浏览器不认识 JSX,老浏览器也不认识部分 ES6+ 语法,必须先编译
  • Babel 负责翻译语法,Webpack 负责把散落的模块打成几个文件,还能压缩混淆
  • 后端 Koa 只负责返回页面和静态资源,页面里引用的是编译产物,不是源码
  • 编译只转语法,Promise、Array.prototype.includes 这类新 API 要靠 polyfill
  • 密钥别通过 DefinePlugin 写进前端包,打进去就等于公开了

这个项目的页面用 React 写,JSX 浏览器看不懂,所以要用 Webpack 配合 Babel 把源码编译成普通 JS,顺便压缩。 你可以把它想成一个翻译加打包的过程:Babel 把 <App /> 翻成 React.createElement(App),把新语法降级;Webpack 顺着 import 把几十个文件合并成几个包,再压缩体积。Koa 那边只管返回 HTML 和这些打包好的文件。要注意编译只解决语法问题,新 API 在老浏览器里还是要 polyfill。

由于demos/project 前端渲染是通过react.js渲染的,这就需要webpack4 对react.js及其相关JSX,ES6/7代码进行编译和混淆压缩。

面试官追问

追问 1浏览器直接引入带 JSX 的文件会怎样?
参考回答

解析到 < 就报 SyntaxError: Unexpected token '<',整个脚本不执行,页面白屏。必须先编译,页面引用 output/dist 里的产物。

追问 2Babel 编译过了,IE 里还是报 Promise is undefined,为什么?
参考回答

Babel 默认只转语法,Promise 是运行时 API,不会凭空变出来。要用 @babel/preset-env 配 useBuiltIns: 'usage' 加 core-js,按需注入 polyfill。

追问 3开发环境要不要也压缩?
参考回答

不用。开发阶段要的是快和好调试,压缩会拖慢构建,报错堆栈也看不懂。压缩只放在生产配置里,开发配 source map。

追问 4能不能把接口密钥用 DefinePlugin 注入到前端代码里?
参考回答

不能。DefinePlugin 是在编译时做文本替换,值会原样写进 bundle,任何人打开 DevTools 都能看到。前端只放公开配置,密钥留在 Koa 服务端。

# webpack4

30 秒速记

  • 四个核心概念:entry 入口、output 输出、loader 转换非 JS 文件、plugin 干 loader 干不了的事
  • Webpack 4 引入 mode:development 不压缩、构建快,production 自动压缩和 tree shaking
  • CommonsChunkPlugin 被 optimization.splitChunks 取代,第三方库抽成 vendor 包
  • Webpack 4 内置压缩器是 terser-webpack-plugin;uglifyjs-webpack-plugin 不支持 ES6+ 语法
  • 构建前清空输出目录,否则旧文件留着会掩盖「这次其实没生成」的问题

Webpack 4 的配置就围绕四个东西:entry 从哪开始、output 输出到哪、loader 怎么转换各种文件、plugin 做额外处理。 它相对 Webpack 3 最大的变化是加了 mode,选 production 就自动帮你压缩、定义 NODE_ENV、开 tree shaking,很多以前要手配的插件都省了。还有拆包从 CommonsChunkPlugin 换成了 splitChunks。压缩这块现在默认用 terser,老教程里的 uglifyjs-webpack-plugin 碰到 const、箭头函数这类 ES6 代码会报错,没有特殊原因就别再用。

理解「webpack4 」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 module 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

Webpack 的配置看起来很多,拆开就四块:

module.exports = {
  mode: 
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
  • 基础篇

    • 环境搭建
    • node部署
    • 基础应用
  • 内置模块

    • 1.0 本地路径处理 path
    • 2.0 文件系统操作 fs
    • 3.1 基础调试 console
    • 3.2 本地调试远程服务器上的Node代码
    • 4.1 网络服务 http
    • 4.2 网络服务 http res
    • 4.3 网络服务 http req
    • 4.4 网络服务 http server
    • 4.5 网络服务 http client
    • 4.6 网络服务 https
    • 4.7 网络TCP net
    • 4.8 网络UDP dgram
    • 4.9 域名解析 dns
    • 5.0 网络地址解析 url
    • 5.1 URL查询字符串 querystring
    • 6.1 流操作 stream
    • 6.2 逐行读取 readline
    • 7.1 进程相关 process
    • 7.2 子进程 child
    • 8.1 二进制数据 buffer
    • 8.2 二进制解码 string_decoder
    • 9.1 事件机制 events
    • 9.2 实用工具模块 util
    • 9.3 数据加密 crypto
    • 9.4 MD5入门介绍及crypto模块的应用
    • 9.4 资源压缩 zlib
    • 9.5 集群 cluster
    • 9.6 v8
  • 进阶篇

    • 5分钟入门非对称加密用法
    • cluster
    • cookie_parser深入
    • crypto模块之理论篇
    • express+cookie_parser签名机制深入剖析
    • express+session实现简易身份认证
    • https
    • log4js入门实例
    • node8_napi
    • 使用 async 控制并发
    • 使用 eventproxy 控制并发
    • 使用 superagent 与 cheerio 完成简单爬虫
    • 基于express+muter的文件上传
    • 将图片转成datauri嵌入到html
    • 常用中间件 body_parser 实现解析
    • 日志模块morgan
    • 服务端字符编解码&乱码处理 charset_enc_dec
    • 测试用例mocha,should,istanbul
    • 调试日志打印debug模块
  • Express

    • 1.1 Express概览篇
    • 1.2 Express
  • Koa2

    • 1.0 koa2概览篇
    • 1.1 快速开始
    • 1.2 async await使用
    • 1.3 koa2简析结构
    • 1.4 koa中间件开发与使用
    • 10.1 单元测试
    • 11.1 开发debug
    • 12.1 快速启动
    • 12.2 框架设计
    • 12.3 分层操作
    • 12.4 数据库设计
    • 12.5 路由设计
    • 12.6 webpack4环境搭建
    • 12.7 使用react
    • 12.8 登录注册功能实现
    • 12.9 session登录态判断处理
    • 13.1 import export使用
    • 2.1 原生koa2实现路由
    • 2.2 koa router中间
    • 3.1 GET请求数据获取
    • 3.2 POST请求数据获取
    • 3.3 koa bodyparser中间件
    • 4.1 原生koa2实现静态资源服务器
    • 4.2 koa static中间件
    • 5.1 koa2使用cookie
    • 5.2 koa2实现session
    • 6.1 koa2加载模板引擎
    • 6.2 ejs模板引擎
    • 7.1 busboy模块
    • 7.2 上传文件简单实现
    • 7.3 异步上传图片实现
    • 8.1 mysql模块
    • 8.2 async await封装使用mysql
    • 8.3 项目建表初始化
    • 9.1 原生koa2实现JSONP
    • 9.2 koa jsonp中间件
  • 其他

    • 操作数据库
    • Session 与 Token
    • Cookie、Session、Token、JWT
    • Socket
完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

webpack4 环境搭建|Nodejs专题系列

# webpack4 环境搭建

30 秒速记

  • 目标:把 JSX、ES6+、Less 编译成浏览器能直接跑的 JS 和 CSS
  • 配置拆三份:base 放共用的入口、loader、插件,dev 和 prod 用 webpack-merge 只写差异
  • Webpack 4 起要写 mode,不写会警告并按 production 处理
  • 构建命令写进 package.json 的 scripts,依赖装在项目里,别靠全局 webpack
  • Webpack 4 已不再维护,新项目直接上 Webpack 5 或 Vite,老项目按官方迁移指南升级

搭 Webpack 环境其实就是告诉它三件事:从哪个文件开始打包、遇到什么类型的文件用什么 loader 转换、最后输出到哪。 这个项目要编译 React 的 JSX、ES6+ 语法和 Less 样式,所以核心是 babel-loader 加一组样式 loader。配置我会拆成基础、开发、生产三份,开发要 source map 好调试,生产要压缩。另外说一句,Webpack 4 是 2018 年的版本,现在已经停止维护,学它的概念没问题,新项目我会直接用 Webpack 5 或者 Vite。

理解「webpack4 环境搭建」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 module 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

Webpack 可以理解成一个「翻译 + 打包」工具:它从入口文件出发,顺着 import / require 把依赖全部找出来,每种文件交给对应的 loader 翻译,最后合成几个浏览器能直接加载的文件。

这个项目的需求是:React 页面用 JSX 写、样式用 Less、组件库用 antd,所以需要的依赖大致是:

npm i -D webpack@4 webpack-cli@3 webpack-merge \
  babel-loader @babel/core @babel/preset-env @babel/preset-react \
  css-loader less less-loader postcss-loader mini-css-extract-plugin
npm i react react-dom antd
@前端进阶之旅: 代码已经复制到剪贴板

package.json 里把命令固定下来:

{
  "scripts": {
    "dev": "webpack --config static/build/webpack.dev.config.js --watch",
    "build": "webpack --config static/build/webpack.prod.config.js"
  }
}
@前端进阶之旅: 代码已经复制到剪贴板

配置拆成三份:webpack.base.config.js 写入口、输出、loader 这些共用部分;开发配置加 mode: 'development' 和 devtool: 'source-map';生产配置加 mode: 'production' 和压缩。开发和生产都通过 webpack-merge 继承基础配置,公共部分只改一处。

版本上要有数:Webpack 5 在 2020 年发布,Webpack 4 已经不再维护,很多 loader 的新版本也不再支持它。照着教程学概念没问题,真开新项目建议直接用 Webpack 5 或 Vite。

面试官追问

追问 1不写 mode 会怎样?
参考回答

Webpack 4 会给一个警告,然后按 production 处理,开发时打出来的代码是压缩过的,调试很痛苦。开发配置里显式写 mode: 'development',process.env.NODE_ENV 也会自动跟着设好。

追问 2为什么不建议用全局安装的 webpack?
参考回答

每台机器装的版本可能不一样,CI 上也不一定有,换台机器就跑不起来。装成项目的 devDependencies,命令写进 scripts,npm run build 用的就是 node_modules/.bin 里那个版本。

追问 3老项目还在 Webpack 4,升到 5 最容易踩哪些坑?
参考回答

Node 核心模块的 polyfill 没了,用到 Buffer、process 的要自己配 resolve.fallback;file-loader、url-loader 被内置的 asset modules 替代;一些插件要升大版本。按官方迁移指南一项项过,比一口气全升稳。

追问 4构建在 CI 上失败了,流水线却显示成功,可能是什么原因?
参考回答

多半是外层脚本把退出码吞了,比如 webpack || true,或者用 & 放后台跑。webpack 编译出错会以非零码退出,直接跑底层命令看 echo $? 就能确认。

# webpack4 环境搭建

# 前言

30 秒速记

  • 浏览器不认识 JSX,老浏览器也不认识部分 ES6+ 语法,必须先编译
  • Babel 负责翻译语法,Webpack 负责把散落的模块打成几个文件,还能压缩混淆
  • 后端 Koa 只负责返回页面和静态资源,页面里引用的是编译产物,不是源码
  • 编译只转语法,Promise、Array.prototype.includes 这类新 API 要靠 polyfill
  • 密钥别通过 DefinePlugin 写进前端包,打进去就等于公开了

这个项目的页面用 React 写,JSX 浏览器看不懂,所以要用 Webpack 配合 Babel 把源码编译成普通 JS,顺便压缩。 你可以把它想成一个翻译加打包的过程:Babel 把 <App /> 翻成 React.createElement(App),把新语法降级;Webpack 顺着 import 把几十个文件合并成几个包,再压缩体积。Koa 那边只管返回 HTML 和这些打包好的文件。要注意编译只解决语法问题,新 API 在老浏览器里还是要 polyfill。

由于demos/project 前端渲染是通过react.js渲染的,这就需要webpack4 对react.js及其相关JSX,ES6/7代码进行编译和混淆压缩。

面试官追问

追问 1浏览器直接引入带 JSX 的文件会怎样?
参考回答

解析到 < 就报 SyntaxError: Unexpected token '<',整个脚本不执行,页面白屏。必须先编译,页面引用 output/dist 里的产物。

追问 2Babel 编译过了,IE 里还是报 Promise is undefined,为什么?
参考回答

Babel 默认只转语法,Promise 是运行时 API,不会凭空变出来。要用 @babel/preset-env 配 useBuiltIns: 'usage' 加 core-js,按需注入 polyfill。

追问 3开发环境要不要也压缩?
参考回答

不用。开发阶段要的是快和好调试,压缩会拖慢构建,报错堆栈也看不懂。压缩只放在生产配置里,开发配 source map。

追问 4能不能把接口密钥用 DefinePlugin 注入到前端代码里?
参考回答

不能。DefinePlugin 是在编译时做文本替换,值会原样写进 bundle,任何人打开 DevTools 都能看到。前端只放公开配置,密钥留在 Koa 服务端。

# webpack4

30 秒速记

  • 四个核心概念:entry 入口、output 输出、loader 转换非 JS 文件、plugin 干 loader 干不了的事
  • Webpack 4 引入 mode:development 不压缩、构建快,production 自动压缩和 tree shaking
  • CommonsChunkPlugin 被 optimization.splitChunks 取代,第三方库抽成 vendor 包
  • Webpack 4 内置压缩器是 terser-webpack-plugin;uglifyjs-webpack-plugin 不支持 ES6+ 语法
  • 构建前清空输出目录,否则旧文件留着会掩盖「这次其实没生成」的问题

Webpack 4 的配置就围绕四个东西:entry 从哪开始、output 输出到哪、loader 怎么转换各种文件、plugin 做额外处理。 它相对 Webpack 3 最大的变化是加了 mode,选 production 就自动帮你压缩、定义 NODE_ENV、开 tree shaking,很多以前要手配的插件都省了。还有拆包从 CommonsChunkPlugin 换成了 splitChunks。压缩这块现在默认用 terser,老教程里的 uglifyjs-webpack-plugin 碰到 const、箭头函数这类 ES6 代码会报错,没有特殊原因就别再用。

理解「webpack4 」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 module 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

Webpack 的配置看起来很多,拆开就四块:

module.exports = {
  mode: 'development',                 // Webpack 4 新增,决定一组默认优化
  entry: { index: './src/pages/index.js' },               // 从哪开始找依赖
  output: { path: __dirname + '/dist', filename: '[name].js' }, // 输出到哪
  module: {
    rules: [
      { test: /\.jsx?$/, exclude: /node_modules/, use: 'babel-loader' }, // loader:翻译文件
    ],
  },
  plugins: [],                          // plugin:介入整个构建过程
}
// 运行后生成 dist/index.js
@前端进阶之旅: 代码已经复制到剪贴板

Webpack 4 相比之前的几个关键变化:一是必须声明 mode,production 会自动开启压缩、作用域提升和 tree shaking,并把 process.env.NODE_ENV 设为 'production';二是 CommonsChunkPlugin 被移除,公共代码用 optimization.splitChunks 拆;三是默认压缩器换成 terser-webpack-plugin,能处理 ES6+ 代码。

如果要自定义 optimization.minimizer,记住它会替换掉默认的压缩器,JS 和 CSS 的压缩插件都要自己写全。另外,构建产物最好在每次构建前清空,不然旧文件留在目录里,构建失败时也看起来像「有产物」。

← 12.5 路由设计12.7 使用react →

fe