Webpack 2中摇晃的ES6模块

发布时间:2018-11-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Webpack 2中摇晃的ES6模块脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

Webpack 2上周刚刚发布测试版。它带来了各种预期功能,包括对ES6模块的本机支持。

VAR module = require('module')webpack 2不支持使用语法,而是支持ES6 importsexports。这为像树木摇晃这样的代码优化打开了大门。

什么是树摇晃?

由Rich Harris的Rollup.js模块捆绑器推广摇动只能包含正在使用的捆绑包中的代码

当我第一次玩Rollup时,我惊讶于它与ES6模块的搭配程度。开发经验感觉......对。我可以创建用“未来的JavaScript”编写的单独模块,然后将它们包含在我的代码中的任何位置。任何未使用的代码都不会进入我的捆绑包。天才!

它解决了什么问题?

如果您在2017年编写JavaScript并了解(参见:JavaScript疲劳)各种工具,那么您的开发体验可能会非常流畅。这很重要,但同样重要的是用户体验。许多这些现代工具最终会使大量JavaScript文件膨胀Web应用程序,导致性能降低。

我对Rollup的喜爱之处在于它对此问题进行了抨击,并为JavaScript社区的最前沿提供了解决方案。现在像webpack这样的大牌企业正在尝试迭代它。

树木摇晃可能不是“解决所有解决方案的解决方案”,但它是更大馅饼中的重要部分。

一个简单的例子

在你开始之前,我想为你提供一个简单的树木摇晃的例子。您的应用程序由2个文件组成,index.jsmodule.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}!`;

// index.js 
import { sayHello } from './module'; 
const element = document.createElement('h1'); 
element.innerHTML = sayHello('World'); 
document.body.appendChild(element);

如果你已经做到一点,你的文件夹结构应如下所示:

/ 
| - node_modules/ 
| - src/ 
|    | - index.js 
|    | - module.js 
| - package.json

第3步:来自CLI的Webpack

由于您没有为项目创建配置文件,因此目前让webpack执行任何工作的唯一方法是通过webpack CLI。让我们进行快速测试。

在终端中,在项目的根目录中运行以下命令:

node_modules/.bin/webpack

运行此命令后,您应该看到如下输出:

No configuration file found and no output filename configured via CLI option. A configuration file could be named 'webpack.config.js' in the current directory. Use --help to display the CLI options.

该命令不执行任何操作,Webpack CLI确认了这一点。您没有向webpack提供有关要捆绑的文件的任何信息。您可以通过命令行配置文件提供此信息。让我们选择前者只是为了测试一切是否正常

node_modules/.bin/webpack src/index.js dist/bundle.js

你现在所做的是通过CLI 传递webpack entry文件和output文件。这个信息告诉webpack,“转到src/index.js并捆绑所有必要的代码dist/bundle.js”。它就是这样。您会注意到您现在有一个dist包含的目录bundle.js

打开它并检查出来。在webpack中需要一些额外的javascript来完成它的工作,但是在文件的底部你也应该看到你自己的代码。

第4步:创建webpack配置文件

Webpack可以处理很多事情。我花了很多空闲时间潜入这个捆绑器,我仍然几乎没有划伤表面。一旦你移动了通过琐碎的例子,最好离开CLI并创建一个配置文件来处理繁重的工作。

在项目的根目录中,创建一个webpack.config.js文件:

touch webpack.config.js

此文件可能与您制作的文件一样复杂。为了这篇文章,我们会保持清醒:

// webpack.config.js 
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = { 
  entry:'。/ src / index.js',
  输出:{ 
    filename:'bundle.js',
    path:'dist' 
  },
  插件:[ 
    new HtmlWebpackPlugin({title:'Tree-shaking'} )
  ] 
}

此文件为webpack提供了之前提供给CLI的相同信息。你定义index.js为您的entry文件,并bundle.js为您的output文件。您还添加了html-webpack-plugin将在您的dist目录中生成HTML文件的内容。方便。

继续测试,以确保它仍然有效。删除dist目录,并在命令行中键入:

webpack

如果一切顺利,你可以打开dist/index.html并看到“Hello World!”。

注意:使用配置文件为我们提供了键入的便利webpack而不是node_modules/.bin/webpack。小胜。

第五步:巴别塔

我之前提到过,webpack 2为ES6模块提供了原生支持。这一切都是正确的,但它并没有改变所有浏览器都不完全支持ES6的事实。正因为如此,你需要变换使用类似的工具你ES6代码转换成易于接受的JavaScript 巴贝尔。与webpack结合使用,Babel使我们能够编写“未来的JavaScript”而无需担心不受支持的浏览器的含义。

让我们继续在您的项目中安装Babel:

npm i --save-dev babel-core babel-loader babel-PReset-es2015

记下babel-preset-es2015包裹。这个小家伙是我坐下来写下这一切的原因

第6步: babel-loader

Webpack可以配置为通过加载器将特定文件转换为模块。转换后,将它们添加到依赖关系图中。Webpack使用该图来解析依赖关系,并且仅包括最终包中所需的内容。这是webpack如何工作的基础。

您现在可以配置webpack以用于babel-loader转换所有  .js文件:

// webpack.config.js 
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = { 
  entry:'。/ src / index.js',
  输出:{filename:'bundle.js',path:'dist'},
  module:{ 
    rules:[ 
      { 
        test:/\。js$/ ,
        exclude:/ node_modules /,
        loader:'babel-loader',
        options:{             presets 
          :[ 
'es2015' 
          ] 
        } 
      } 
    ] 
  },
  plugins:[ 
    new HtmlWebpackPlugin({title:'Tree-shaking'})
  ] 
};

module属性为webpack提供了一组说明。它说,“将所有文件结束  .js并使用它们进行转换babel-loader,但不要转换其中的任何文件node_modules!”

我们也将babel-preset-es2015包裹作为选项传递给babel-loader。这只是讲述了babel-loader如何转换JavaScript。

webpack再次运行以确保一切都很好。是?大!我们所做的就是捆绑你的JavaScript文件,同时将它们编译成可以跨浏览器轻松支持的JavaScript。

根本问题

软件包babel-preset-es2015包含另一个名为的包babel-plugin-transform-es2015-modules-commonjs,可将所有ES6模块转换为CommonJS模块。这不是理想的,这就是原因。

诸如webpack和Rollup之类的Javascript捆绑器只能在具有静态结构的模块上执行树抖动。如果模块是静态的,那么捆绑器可以在构建时确定其结构,安全地删除未在任何地方导入的代码。

CommonJS模块没有静态结构。因此,webpack将无法从最终的捆绑包中破坏未使用的代码。幸运的是,Babel通过为开发人员提供了一个可以传递给您的presets阵列的选项来缓解这个问题babel-preset-es2015

options: { presets: [ [ 'es2015', { modules: false } ] ] }

根据巴贝尔的文件

“modules - 启用将ES6模块语法转换为另一种模块类型(默认情况下启用为“commonjs”)。可以是false不转换模块,或["amd", "umd", "Systemjs", "commonjs"]

将额外的代码滑入您的配置中,您将使用花生油烹饪。

最终状态webpack.config.js如下:

// webpack.config.js 
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = { 
  entry:'。/ src / index.js',
  输出:{filename:'bundle.js',path:'dist'},
  module:{ 
    rules:[ 
      { 
        test:/\。js$/ ,
        exclude:/ node_modules /,
        loader:'babel-loader',
        options:{             presets 
          :[ 
['es2015',{modules:false}] 
          ] 
        } 
      } 
    ] 
  },
  插件:[new HtmlWebpackPlugin({title:'Tree-摇晃'})] 
};

大结局

webpack再次运行并弹出您的bundle.js文件。你不会注意到任何差异。在你发疯之前,要知道这一点!没关系。我们一直在开发模式下运行webpack。Webpack知道您的代码中有未使用的导出。即使它包含在最终的捆绑包中,sayBye永远不会进入生产阶段

如果您仍然不相信我,请webpack -p在您的终端中运行。该-p选项代表生产。Webpack将执行一些额外的性能优化,包括缩小,在此过程中删除任何未使用的代码。

打开bundle.js。由于它已缩小,请继续搜索Hello。它应该在那里。搜索Bye。它不应该

瞧!你现在在webpack 2中有一个工作的树摇动实现!

觉得可用,就经常来吧!es6教程 脚本宝典 欢迎评论哦!巧夺天工,精雕玉琢。小宝典献丑了!

脚本宝典总结

以上是脚本宝典为你收集整理的Webpack 2中摇晃的ES6模块全部内容,希望文章能够帮你解决Webpack 2中摇晃的ES6模块所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。