技术 | webpack 2 使用总结

Posted 子曰五溪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技术 | webpack 2 使用总结相关的知识,希望对你有一定的参考价值。


不知不觉中 webpack 都出了2.x 版本了,而且还是正式的,如果你还在使用1.x,是时候该升级升级了。本文主要从“用”的方向上来简单介绍webpack 2.x,并未涉及它的构成,So,若有不当之处,且可指出。


至于webpack是什么,还请没有使用过的同学,自行Google。


webpack 2.x 增加了对 ES6的原生支持,这也意味着现在它可以识别 "import" 和 "export"了,再也不需要先把它们转换成 CommonJS 模块的格式再处理。现在我们基本上是用babel来处理,而当你使用webpack 2.x 来处理ES6的模块时得换一个preset了,es2015-webpack preset。


当然 webpack 2.x 还增加了 tree-shaking 技术,这玩意最早在 rollup.js 中提供,这是另外一个打包工具,社区就是这样,如果webpack不搞,就只有被淘汰的命运了。不过,目前来看 rollup.js 前景堪忧。


安装没有什么多余的好说,依然还是使用 npm install ,你可以先 mkdir webpack-demo && cd webpack-demo,然后npm init -y,最后npm install --save-dev webpack来安装,现在你可以在webpack-demo目录下创建一个index.js文件。


目前 webpack 2.x 的配置 整体上与 webpack 1.x 只有稍许区别,其他都一样。一个entry,一个output,一个loaders,一个plugins,当然其他的配置,比如别名,快捷文件后缀等都如同。那么不同之处呢?最大的不同之处,还是在于解析器的不同,基本上都是在做减法,将配置信息变得不那么容易写错,以及更好的命名规则。

var path = require('path');

module.exports = {  entry: './app/index.js',  output: {    filename: 'bundle.js',    path: path.resolve(__dirname, 'dist')  }
};

摘录官网的例子 


alias

alias: {
  Utilities: path.resolve(__dirname, 'src/utilities/'),
  Templates: path.resolve(__dirname, 'src/templates/')
}

mainFields

{
  ...
  main: 'build/d3.Node.js',
  browser: 'build/d3.js',
  module: 'index',
 ...
}


从1.x 迁移 到 2.x


官网给出了一个网页: 来帮助大家从1.x 迁移到 2.x。这里给出了大量详细的信息,这一次可以为webpack团队点赞,相比1.x的文档,2.x感觉提升了不止一个档次。


这里主要说一下以前的大家使用loaders是配置在一个module中,比如:

module: {
   loaders: [
     {
        test: /\.js$/,
        loader: 'babel-loader'
     }
   ]
}

而现在使用 webpack 2.x时:

module: {    rules: [
       {
           test: /\.css$/,
           use: [
               {
                   loader: 'style-loader'
               },
               {
                   loader: 'css-loader'
               }
           ]
       }
   ]
}

当然,还有很多细节问题,就不一一述说了,大家在使用的时候可以详细的阅读一下 1.x 迁移到 2.x的文档。


webpack-dev-server

devServer: {
  contentBase: path.join(__dirname, "dist"),
  compress: true,
  port: 9000
}


热替换这个特性在开发阶段是非常有用的,webpack-dev-server跟以往一样也提供了命令行模式,不过现在我更喜欢在config文件中配置。


而开发模式有了更详细的配置信息:



那么,我们为什么要使用 webpack 2.x ,我们可以得到什么收益?其实这是一个非常重要的问题,把它考虑清楚了,在各位的公司中,生产环境里,运用它才可能。如果没有收益,我们又何必升级呢?


可以得到什么收益?


我想最大的收益在于针对ES6规范的优化,ES6的模块与生俱来的静态特性允许我们使用一些新的优化措施,比如tree-shaking。webpack 2.x 对ES6模块的原生支持,这也意味着可以直接使用 import 以及 export,而不必再来一次CommonJS模块处理。


而且ES6 Loader定义的 System.import,在webpack 2.x中也得到了支持,每一个请求的模块将放入一个单独的chunk,其实这有点像webpack1.x中的require.ensure,这个特性对于大文件而产生的巨长的加载时间有优化的意义。在某些情况下 webpack 2.x可以探测到一个输出有没有被引用,这样在最后build阶段时,压缩工具可以把这些无用的处理掉,从而不会增加文件的大小。


对于现代应用来说,我们在生产环境中大量使用了ES6,这些收益,我想应该是我们最想升级的触动。


关注与我共创






以上是关于技术 | webpack 2 使用总结的主要内容,如果未能解决你的问题,请参考以下文章

webpack总结篇

webpack用法总结---性能优化

webpack4常用片段

前端工程化之webpack打包知识总结

JavaScript系列文章:React总结之Webpack模块组织

第641期基于 webpack 搭建前端工程基础篇