惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Jina AI
Jina AI
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
J
Java Code Geeks
博客园 - 【当耐特】
小众软件
小众软件
博客园 - Franky
S
SegmentFault 最新的问题
WordPress大学
WordPress大学
雷峰网
雷峰网
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
Last Week in AI
Last Week in AI
博客园_首页
月光博客
月光博客
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
Webroot Blog
Webroot Blog
Stack Overflow Blog
Stack Overflow Blog
腾讯CDC
云风的 BLOG
云风的 BLOG
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
Recent Commits to openclaw:main
Recent Commits to openclaw:main
D
Docker
The Last Watchdog
The Last Watchdog
有赞技术团队
有赞技术团队
Hacker News - Newest:
Hacker News - Newest: "LLM"
D
DataBreaches.Net
S
Security @ Cisco Blogs
Blog — PlanetScale
Blog — PlanetScale
GbyAI
GbyAI
TaoSecurity Blog
TaoSecurity Blog
S
Security Affairs
Y
Y Combinator Blog
O
OpenAI News
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Forbes - Security
Forbes - Security
P
Palo Alto Networks Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
K
Kaspersky official blog
Cloudbric
Cloudbric

webpack

[前端] 前后端分离开发过程中,对 session 有依赖,如何优雅处理? - V2EX 如何在编译时检测是否引入开发的代码 - V2EX webpack-dev-server 启动 dev server 后,如何让其它的机器可以访问该 server? - V2EX webpack.config.js 在 exports 配置之前,能先执行一段异步代码到? - V2EX webpack 关于依赖提取的 build 差异 - V2EX webpack 里面 definePlugin 里面定义了一些 process.env 的变量,这个是如何应用到 runtime 环境的? - V2EX webpack5 打包后为何最外层使用的是箭头函数包裹,能否去掉? - V2EX 为什么起个空项目配置 webpack 编译的速度不如 create-react-app 创建的项目快? - V2EX 问下大佬们,webpack 的动态导入怎么实现比较好? - V2EX 你真的理解 Webpack?请回答下列问题。 - V2EX webpack 那么牛逼。如果只是写 vue 的话,只是不是只要 vue cli 就够了。 - V2EX 为什么 vue 项目木打包后必须部署在服务器或本地起一个 web 服务才能运行? - V2EX Webpack 中如何关联 AMD 模块的依赖映射? - V2EX vue 编译后如何嵌入到类似 jsp 老系统中? - V2EX Webpack build 出来的 CSS 内资源路径与 dev-server 调试的时候不一样? - V2EX 不了解 WebAssembly 和 webpack 的关联 webpack 工程化和 vue 单文件组件开发例子项目 - V2EX 关于 webpack 配置多页面之后的热更新问题 - V2EX 关于 webpack-dev-server 的配置问题 - V2EX webpack 的官方 node-loader 是放弃治疗了吗 - V2EX 只编译 Pug 时配置应该怎么写? - V2EX webpack 和 redux 调试问题 - V2EX 关于 webpack 和 ES6 的问题 - V2EX 怎么在 webpack devserver 里 用相对路径 import scss(font-awesome)? - V2EX 怎样调试 Webpack 打包好的代码吗? webpack 的 Code Splitting 不支持第三方 css 吗? - V2EX 前端轮子们: gulp 和 webpack 是不是有功能上的 overlap - V2EX gulp 和 webpack 区别 - V2EX Webpack 怎么改 html 中的 js 路径? - V2EX
webpack 现在依然不能自动支持 tree-shaking,来优化引入的包么? - V2EX
yazoox · 2021-10-29 · via webpack

这是一个创建于 1689 天前的主题,其中的信息可能已经有所发展或是发生改变。

https://www.jianshu.com/p/7994b1fc6dfe

读到一篇文章,提到了,webpack 如果想在引入一个包的时候,编译只引入的那部分代码,需要 babel 的支持。而且,只对自己的代码有效。如果是第三方的包,还不行,得写一个插件,实现转换。比如,

import { x } from 'module1';

转换成

import { x } from 'module1/a/bc';

要这么麻烦才能够实现 tree-shaking 啊!

当然这是 3 年前的文章了,现在的 webpack 也进化到了 5.0 的版本了吧?现在还是这样的么?

noe132

1

noe132      2021 年 10 月 29 日   ❤️ 3

你这篇文章基本已经过时了。比如现在 webpack 用的不是 uglyfy plugin ,而是 terser plugin 。

只要你用到的库是 esm 而且 sideEffects: false ,tree shaking 就会正常工作。参考 material-ui ,代码结构就是这个文章所说的那种格式,不需要任何配置就支持 tree shaking 。

那种 babel 转换插件是 webpack 支持 tree shaking 之前存在的优化技巧,现在完全不需要这样的东西。

只有没有提供 esm 的库不支持 tree shaking ,比如 lodash 。这种情况你就必须手动 import 相应函数比如 'lodash/map',或者使用 babel-plugin-lodash ,更好的方法是使用 webpack alias 替换成 lodash-es 等支持 esm 的库。

推荐阅读最新版本的官方文档
https://webpack.js.org/guides/tree-shaking/

wszgrcy

2

wszgrcy      2021 年 10 月 29 日

楼上基本上都说了.然后我记得还有作用域提升,应该也算摇树的一种吧.

yyfearth

3

yyfearth      2021 年 10 月 29 日   ❤️ 1

一楼说的很全了 像 lodash 这种 如果你不用 lodash-es 那就需要用 plugin
如果 package 提供了 esm 并且提供了 sideEffect flag 的话 就都可以自动 tree-shaking 了
而且 webpack5 连非纯 esm 的 bundle 都可以做一定的 tree-shaking 了

但是你用自己内部做的包 很可能就不能自动 tree-shaking (除非特别处理)
这也是我经历过抱怨和误解最多的时候
因为要支持 tree-shaking 必须提供 esm 和 sideEffect 的信息
很多人做内部的包很喜欢把所有的东西用 index 全部导出来 但是有不知道怎么声明 sideEffect
或者用 webpack 或者其他 bundle 打包成了一个文件 cjs/umd 或者 单个 esm (就是把所有文件合并后导出成一个 esm ) 结果都没办法 tree-shaking 导致整个包全部被 webpack 打包

作为 library 想支持 tree-shaking
1. package.json 要提供 module 或者 browser 的 esm 入口 或者 exports
2. 不打包成一个文件 最好只做 babel 或者 tsc 就够了 最多用 rollup 分组件打包
3. 声明 sideEffect false 或者 指定需要 sideEffect 的文件
在使用 library 的时候 webpack 需要用 mode: production 并且启动了 minimize 和 TerserPlugin 才能充分使用 tree-shaking

虽然现在 webpack 和 esm 已经出来很久了
但是浏览器和 nodejs 的支持还是不是很完美
这个只能自己花时间 或者培训团队了

yyfearth

4

yyfearth      2021 年 10 月 29 日

@wszgrcy 我记得作用域提升 貌似不是为了 tree-shaking 而是为了 dedup
另外还有一个很强的功能就是 esm 的 concat 功能 不过和 tree-shaking 没有直接关系

wszgrcy

5

wszgrcy      2021 年 10 月 29 日

@yyfearth 对了我突然想到一个东西,但是不知道在哪里遇到过,就是打包为 fesm,也就是单文件 esm,然后如果里面有一个直接的语句,比如 console.log()这样,这句肯定没法被引用,然后再我的记忆中,这种语句如果设置无副作用的话应该是会被抛弃的(记忆中感觉遇到过一次),但是实际上并没有,不知道是不是我记错了