[译]Webpack 2 Tree Shaking配置

news/2024/7/3 18:51:11

原文

Tree Shaking是一个针对ES6以上代码的清楚死代码的算法,也是Webpack 2最被期待的特性之一。通过清除未使用的ES6引用,Webpack能更助于压缩过程从而得到比之前更小的文件体积。

Webpack 2简单应用代码已更新为支持[Webpack2.2],React (v15.4)以及Babel。

Tree shaking最终得到的文件只会包含你引用的脚本。那些不被引用的则不会出现在最终文件中。

如下示例代码,我将展示新的Webpack 2配置将一个已经优化过的Webpack1项目再减少28%的大小。

放弃CommonJS,拥抱原生Imports

Webpack2目前能够直接解析原生import,而不用转换为CommonJS模块。这一点极其重要,如果你使用CommonJS暴露模块会导致引用有效,这意味着你在export声明中的一切都会被包含于最终的构建文件中。

为了压缩体积,你需要微调一下.babelrc配置。你需要使用babel-preset-es2015-native-modules来替代先前的es2015。这个配置控制在Babel编译的过程中跳过CommonJS模块转换的步骤。

使用npm安装:

npm i babel-preset-es2015-native-modules --save-dev

新的.babelrc文件:

{
  “presets”: [“es2015-native-modules”]
}

如果你使用了React:

{
  “presets”: [“es2015-native-modules”, “react”]
}

现在你搞定了Babel配置。本质上,你已经完成了Webpack2中tree shaking的所有工作。

所以现在让我们谈谈Webpack2的一些重要更新,以便帮到那些想从Webpack1迁移到Webpack2的人。

Webpack1迁移到Webpack2

Tree shaking是Webpack2开箱即用的功能。如果你现在有一个项目,是时候改进一些旧的配置。也许,你维护的可能是一个使用Webpack1的子项目。让我们来回顾一些在你更新配置时需要注意的突破性的变化。

1.Loader配置

在你定义loader配置时有一些小改变。之前的类GET语法被换成了JSON形式的声明。

让我们看看一个Webpack 1.x的例子:

loaders: [{
  test: /\.html$/,
  loader: 'file?name=[name].[ext]'
}]

同样的配置在Webpack 2.x会变成这样

loaders: [{
  test: /\.html$/,
  loader: 'file',
  query: {
    name: '[name].[ext]'
  }
}]

注意现在配置项以键值对的形式存在query参数重(译注:现在更提倡使用options)

2.Resolver

Webpack 2中,resolve.rootresolve.fallbackresolve.modulesDirectories这些选项被整合进resolve.modules。以下就是在Webpack 2中解析文件与模块地址的例子:

resolve: {
  modules: [
     path.resolve('./client'), 
     'node_modules'
  ]
}

你可以指定一些列modules名单,但别忘了node_modules与npm dependencies是无法加载的。

3.Uglify插件的变化

UglifyJsPlugin不再压缩'loader',不推荐使用这种调试选项。这一功能被移入另一插件LoaderOptionsPlugin之中:

new webpack.LoaderOptionsPlugin({
  minimize: true,
  debug: false
}),

4.其他变化

强烈推荐Tobias Koppers aka Sokra的webpack 2新功能

实例

可以参考React + Redux + Webpack 2构建app示例,其中包含了将你项目变得更小的所有重要的配置。与同样但使用Webpack1的示例,能较少28%的文件体积。

图片描述


http://www.niftyadmin.cn/n/4588223.html

相关文章

Ruby学习笔记系列(一)

1, 用Net::HTTP.geturi URI(http://xxxxxxx.com/api/user/1.0/json/get_info?&user_id3) Net::HTTP.get(uri)2, 用Net::HTTP.get 时加一些参数uri URI(http://xxxxxx.com/api/user/1.0/json/get_info) params { :user_id > 3} uri.query URI.encode_www_form(param…

application与ServletContext的异同

相同:其实servletContext和application 是一样的,就相当于一个类创建了两个不同名称的变量。 在servlet中ServletContext就是application对象。大家只要打开jsp编译过后生成的Servlet中的jspService()方法就可以看到如下的声明: …

通过BeanFactoryPostProcessor来获取bean

一、现在我们很多时候都在spring的容器中,进行bean的提取和操作,但是配置里面首先需要扫描相应的包来实现相关bean的注入 但是问题来了。如果我们在另外一个线程需要用的时候,并且没有配置扫描该类。那么手动去获取bean就很有必要的。 二、这…

UML类间关系

1继承 指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字ex…

Linux vim命令记录

Ndd :删除N行 多行删除 :1,10d ctrlv ,移动光标,ctrli,输入#,esc :移动处均会输入# gg:文档头 G:文档尾 o:下一行,并进入insert模式 O&#xff1…

两点单向重分发引起的路由环路问题

1.网络拓扑结构:2.IP地址配置情况在上图中已有明确的标识在此就不再赘述了。3.将IP地址配置好,并启用路由协议4.将直连路由重分发进来5.在R2上将EIGRP重分发进OSPF在R3上将OSPF 重分发进EIGRP我们可以看出在配置EIGRP重分发进OSPF中和OSPF重分发进EIGRP中…

MySQL主从配置笔记

2019独角兽企业重金招聘Python工程师标准>>> 因为要写一个订阅MySQL binlog的基础服务,所以需要配置一套MySQL主从,做开发环境,在这里做个笔记。 MySQL版本5.7.17 主库配置 [mysqld] log_bin /path/mysql/master/data/log_binbas…

ExtJs Model之convert的使用

convert: function(value,record){} value:为当前属性的值,record.get(属性)用来获取其他属性的值。 以下案例是:将年龄减去2。 Ext.define(MyModel, {extend: Ext.data.Model,fields: [{name: name, type: string},{name: age, type: int,convert: func…