玩转 webpack
程柳锋
腾讯高级工程师,IVWEB 团队社区和工程化负责人
27458 人已学习
新⼈⾸单¥68
课程目录
已完结/共 87 讲
加餐:webpack 5 专题内容 (3讲)
玩转 webpack
登录|注册
留言
37
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 26 | 多页面应用打包通用方案
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
03 | 为什么需要构建工具
04 | 前端构建演变之路
05 | 为什么选择webpack
06 | 初识webpack
07 | 环境搭建:安装webpack
08 | webpack初体验:一个最简单的例子
09 | 通过npm script运行webpack
10 | webpack核心概念之entry
11 | webpack核心概念之output
12 | webpack核心概念之loaders
13 | webpack核心概念之plugins
14 | webpack核心概念之mode
15 | 解析ECMASCript 6和React JSX
16 | 解析CSS、Less和Sass
17 | 解析图片和字体
18 | webpack中的文件监听
19 | webpack中的热更新及原理分析
20 | 文件指纹策略:chunkhash、contenthash和hash
21 | HTML 、CSS和JavaScript代码压缩
22 | 自动清理构建目录产物
23 | PostCSS插件autoprefixer自动补齐CSS3前缀
24 | 移动端CSS px自动转换成rem
25 | 静态资源内联
26 | 多页面应用打包通用方案
27 | 使用sourcemap
28 | 提取页面公共资源
29 | Tree Shaking的使用和原理分析
30 | Scope Hoisting使用和原理分析
31 | 代码分割和动态import
32 | 在webpack中使用ESLint
33 | webpack打包组件和基础库
34 | webpack实现SSR打包(上)
35 | webpack实现SSR打包(下)
36 | 优化构建时命令行的显示日志
37 | 构建异常和中断处理
38 | 构建配置包设计
39 | 功能模块设计和目录结构
40 | 使用ESLint规范构建脚本
41 | 冒烟测试介绍和实际运用
42 | 单元测试和测试覆盖率
43 | 持续集成和Travis CI
44 | 发布构建包到npm社区
45 | Git Commit规范和changelog生成
46 | 语义化版本(Semantic Versioning)规范格式
47 | 初级分析:使用webpack内置的stats
48 | 速度分析:使用speed-measure-webpack-plugin
49 | 体积分析:使用webpack-bundle-analyzer
50 | 使用高版本的webpack和Node.js
51 | 多进程/多实例构建
52 | 多进程并行压缩代码
53 | 进一步分包:预编译资源模块
54 | 充分利用缓存提升二次构建速度
55 | 缩小构建目标
56 | 使用Tree Shaking擦除无用的JavaScript和CSS
57 | 使用webpack进行图片压缩
58 | 使用动态Polyfill服务
59 | webpack启动过程分析
60 | webpack-cli源码阅读
61 | Tapable插件架构与Hooks设计
62 | Tapable是如何和webpack进行关联起来的?
63 | webpack流程篇:准备阶段
64 | webpack流程篇:模块构建和chunk生成阶段
65 | webpack流程篇:文件生成
66 | 动手编写一个简易的webpack(上)
67 | 动手编写一个简易的webpack(下)
68 | loader的链式调用与执行顺序
69 | 使用loader-runner高效进行loader的调试
70 | 更复杂的loader的开发场
71 | 实战开发一个自动合成雪碧图的loader
72 | 插件基本结构介绍
73 | 更复杂的插件开发场景
74 | 实战开发一个压缩构建资源为zip包的插件
75 | 商城技术栈选型和整体架构
76 | 商城界面UI设计与模块拆分
77 | React全家桶环境搭建
78 | 数据库实体和表结构设计
79 | 登录注册模块开发
80 | 商品模块开发
81 | 订单模块开发
82 | 谈谈Web商城的性能优化策略
83 | 功能开发总结
84 | 玩转webpack结束语
加餐:webpack 5 新特性解析
加餐:bundle和bundless的差异
加餐:Vite的构建原理
本节摘要
登录 后留言

全部留言(37)

  • 最新
  • 精选
袋袋
entryFIles本来不就是一个数组吗,为什么还要用Object.key来处理,还有map不是需要返回值吗,为什么不用forEach,循环里参数第一个值不就是当前项吗,为什么要用index来获取,还有pageName中的index,input那几个值怎么来的。

作者回复: 1. 完全也推荐用 map 的写法,因为我们这个地方是一步到位讲解了通用的打包方案,如果有个中间演变方案,就比较容易理解为什么用 Object.keys 写法。比如: entry: { index: './src/index/index.js', search: './src/search/index' } 这个时候动态设置 html-webpack-plugin的数量是不是就需要先获取 keys? 这个情况的 entry 是一个 ojbect 就需要 object.keys 去获取了。由于此处是直接将最通用的方案,完全可以用 map 的写法。 2, 还有pageName中的匹配规则就是获取entry路径中的 ./src/ 开头和 /index.js 结尾中间的内容。也即页面的名字

2019-06-10
7
20
SCRD
特别想问一下,webpack和后端项目多页面怎么结合,尤其是更新相应文件缓存,还是说一定要和gulp结合

作者回复: 更新文件缓存是生成的文件指纹去控制的,文件变化后,那么文件指纹会发生相应变化,就不会出现缓存还在的问题了。顺便说下通常的文件缓存策略: html: header 头的 cache-control 会设置成 no-cache。也就是 html 文件不会走缓存 css/js/img 等静态资源:header头的 cache-control 设置成强缓存,缓存时间通常是1年的样子。通过文件指纹控制缓存是否失效,文件指纹一变,请求就不会走旧文件了。

2019-06-13
2
10
脱尼
老师您好!生成的每个html页面都会inject 所有的js,例如视频中的 index.html里面会嵌入 index_xxx.js 和 search_xxx.js ,怎么做到只嵌入当前页面相关的js

作者回复: html-webpack-plugin 里面有哥 chunks 字段,可以通过它指定需要嵌入进去的 chunks 的,比如(注意看chunks): htmlWebpackPlugins.push( new HtmlWebpackPlugin({ inlineSource: '.css$', template: path.join(__dirname, `src/${pageName}/index.html`), filename: `${pageName}.html`, chunks: [pageName], inject: true, minify: { html5: true, collapseWhitespace: true, preserveLineBreaks: false, minifyCSS: true, minifyJS: true, removeComments: false } }) ); });

2019-06-17
4
灯火阑珊
这里entryFiles直接用map,取第一个参数实测效果一样,用Objec.keys是有什么特别原因么,麻烦老师解释一下。

作者回复: 哈哈,这里主要是如果 entry是 hard code的写法的话,那么entry是一个 object,例如: entry: { index: './src/index/index.js', search: './src/search/index.js' } 那么,我们获取动态设置 html-webpack-plugin 是不是需要通过 Object.keys 去获取key,主要是基于这点去考虑的哈。 由于我们这里直接演示了最通用的方案,一步到位,其实完全用 map 匹配没问题的,直接用 map 匹配即可。

2019-06-12
4
2020
const match = entryFile.match(/src\/(.*)\/index\.js/) 为什么这句我得这么写才能匹配出正确的pageName

作者回复: 此处的匹配规则是 src目录的子目录,并且这个子目录含有 index.js 入口文件。 我们把匹配的内容在src 和 index.js 之间,因此需要用 (.*)包裹起来获取

2019-06-14
2
2
飞天
老师可以提高录制频率吗?您讲得非常好,我都看完,代码也写完一遍啦

作者回复: 厉害了👍 这么爱学习

2019-06-16
1
老师好,我之前一个多页面应用中是用的内置的`fs`模块解析的文件路径,最终实现方式跟本节课中的类似,但是没有用`glob`模块,请问用`glob`模块除了简洁一点之外还有什么好处吗?我之前的代码如下: ``` //获取html插件 const getAppIndex = (files) => { return files.reduce((data, file) => { const [key, template, appJs] = file; if( fs.existsSync( appJs ) ){ data.appIndexJs[key] = [ 'babel-polyfill', appJs ]; data.appHtml.push( new HtmlWebpackPlugin({ template: template, filename: `${key}.html`, chunks: [key] }) ) } return data; }, { appIndexJs: { }, appHtml: [ ] }) } const { appIndexJs, appHtml } = getAppIndex(paths.appIndex); ```

作者回复: glob模块主要就是文件的通配匹配能力比较强,你自己去实现一个类似的获取某个目录下的所有入口文件也是可以的。

2019-09-07
micstone
老师,你好,比如修改了其中一个页面,这样配置的话会把所有的页面打包呢

作者回复: 是的,不过开发环境是增量构建的,只有发布阶段是全量构建。

2019-07-06
KaKa
老师, 有个地方不太懂,希望老师能够私回我。 const pageName = match && match[1] 等号右边为啥这样写?直接 const pageName = match[1] 不可以吗? 我基础不太好··希望老是能够解答

作者回复: 这个主要是为了兼容异常的情况哈,比如这个正则如果返回的结果为 null,这个时候直接用 match[1]就报错了。 其实,日常编写的很多 JS 业务代码也需要进行相关变量存在与否的判断

2019-06-11
KI
老师您好,跟着您的视频来写,发现后面报错enrty is not defined是怎么回事?

作者回复: 可以贴一下你的 webpack 配置吗?我帮你看看哈。 另外你可以把 entry 用 console.log 打印出来看看

2019-06-11
收起评论