Webpack 2上周刚刚发布测试版。它带来了各种预期功能,包括对ES6模块的本机支持。
VAR module = require('module')
webpack 2不支持使用语法,而是支持ES6 imports
和exports
。这为像树木摇晃这样的代码优化打开了大门。
什么是树摇晃?
由Rich Harris的Rollup.js模块捆绑器推广,树摇动只能包含正在使用的捆绑包中的代码。
当我第一次玩Rollup时,我惊讶于它与ES6模块的搭配程度。开发经验感觉......对。我可以创建用“未来的JavaScript”编写的单独模块,然后将它们包含在我的代码中的任何位置。任何未使用的代码都不会进入我的捆绑包。天才!
它解决了什么问题?
如果您在2017年编写JavaScript并了解(参见:JavaScript疲劳)各种工具,那么您的开发体验可能会非常流畅。这很重要,但同样重要的是用户体验。许多这些现代工具最终会使大量JavaScript文件膨胀Web应用程序,导致性能降低。
我对Rollup的喜爱之处在于它对此问题进行了抨击,并为JavaScript社区的最前沿提供了解决方案。现在像webpack这样的大牌企业正在尝试迭代它。
树木摇晃可能不是“解决所有解决方案的解决方案”,但它是更大馅饼中的重要部分。
一个简单的例子
在你开始之前,我想为你提供一个简单的树木摇晃的例子。您的应用程序由2个文件组成,index.js
和module.js
。
在module.js
你里面导出2个命名箭头函数:
// module.js
export const sayHello = name => `Hello ${name}!`;
export const sayBye = name => `Bye ${name}!`
仅sayHello
导入到index.js
文件中:
// index.js
import { sayHello } From './module';
sayHello('World');
sayBye
已导出但从未导入。无处不在。因此,由于树木抖动,它不会包含在您的捆绑中:
// bundle.js
const sayHello = name => `Hello ${name}!`;
sayHello('World');
根据使用的捆绑包,上面的输出文件可能看起来不同。它只是一个简化版本,但你明白了。
最近我读了一篇由Roman Liutikov撰写的文章,他为了想象树摇动的概念做了一个很好的比喻:
“如果你想知道为什么它被称为树震动:将你的应用程序想象为依赖图,这是一棵树,每个导出都是一个分支。因此,如果你摇动树木,枯枝就会掉下来。“ - 罗曼柳蒂科夫
在webpack 2中摇晃树
不幸的是,对于我们这些使用webpack的人来说,如果你愿意的话,树木摇晃是“在开关后面”。与Rollup不同,在获得您正在寻找的功能之前,需要进行一些配置。“开关背后”部分可能会让一些人感到困惑。我会解释一下。
第1步:项目设置
我将假设您了解webpack基础知识,并且可以找到基于webpack配置文件的方法。
让我们从创建一个新目录开始:
mkdir webpack-tree-shaking && cd webpack-tree-shaking
进入后,让我们初始化一个新npm
项目:
npm inIT -y
该-y
选项可package.json
快速生成,无需回答大量问题。
接下来,让我们安装一些项目依赖项:
npm i --save-dev webpack@beta htML-webpack-plugin
上面的命令将在您的项目中本地安装最新的webpack 2测试版以及一个名为的有用插件html-webpack-plugin
。后者对于本演练的目标不是必需的,但会使事情变得更快。
注意:npm i --save-dev webpack@beta
在撰写本文时,webpack团队仍然建议使用该命令。webpack@beta
最终将逐步取消,以支持webpack
最新的命令。看看如何下载? 部分的WebPack的最新版本后的更多细节。
打开package.json
并确保它们已安装为devDePEndencies
。
第2步:创建JS文件
为了在行动中看到树木震动,你需要有一些JavaScript来玩。在项目的根目录中,创建一个src
包含2个文件的文件夹:
mkdir src && cd src
touch index.js
touch module.js
注意:该touch
命令通过终端创建一个新文件。
将以下代码复制到正确的文件中:
// module.js
export const sayHello = name => `Hello ${name}!`;
export const sayBye = name => `Bye ${name}!`;