原文地址
本文是作者对自己所学的webpack技巧的总结,在没有指定特殊情况下适用于webpack 3.0版本。

进度汇报

使用webpack --progress --colors这样可以让编译的输出内容带有进度和颜色。

压缩

在生产环境中构建项目时,使用

webpack -p

这行代码在webpack 2中还会自动设置

process.env.NODE_ENV === 'production'

复数文件打包

通过设置output属性为[name].js来导出复数包。下面的例子将会生成a.jsb.js

module.exports = {
entry: {
a: './a',
b: './b'
},
output: { filename: '[name].js' }
}

担心会重复打包?使用 CommonsChunkPlugin 来把通用部分移入一个新的输出文件中。

plugins: [ new webpack.optimize.CommonsChunkPlugin('init.js') ]
<script src='init.js'></script>
<script src='a.js'></script>

分离app文件与第三方库文件

使用CommonsChunkPlugin将第三方代码移动到vendor.js中。

var webpack = require('webpack')

module.exports = {
entry: {
app: './app.js',
vendor: ['jquery', 'underscore', ...]
}, output: {
filename: '[name].js'
}, plugins: [
new webpack.optimize.CommonsChunkPlugin('vendor')
]
}

让我们来看看,CommonsChunkPlugin是怎么起作用的:

  • 我们指定了一个叫vendor的入口,并且它加载了jquery等第三方库。
  • CommonsChunkPlugin识别到这些第三方库在app.js中出现重复,便将app.js中的第三方库都移除。
  • 在vendor.js中,CommonsChunkPlugin还加入了webpack的运行时间。

参考链接:Code splitting

资源映射 (webpack 1)

最好的资源映射选项是cheap-module-eval-source-map。当使用chrome/firefox的开发者工具时,它会显示原始资源文件。另一方面,它比source-mapeval-source-map更快。

// 只在webpack 1中有效
const DEBUG = process.env.NODE_ENV !== 'production' module.exports = {
debug: DEBUG ? true : false,
devtool: DEBUG ? 'cheap-module-eval-source-map' : 'hidden-source-map'
}

你的文件在chrome开发者工具中显示为webpack:///foo.js?a93h。如果我们希望文件名显示得更清晰呢,比如说webpack:///path/to/foo.js

output: {
devtoolModuleFilenameTemplate: 'webpack:///[absolute-resource-path]'
}

参考链接: devtool documentation

资源映射(webpack 2-3)

在webpack 2-3版本中,最好的资源映射选项是cheap-module-source-map,因为cheap-module-eval-source-map策略已经不能在chrome/firefox中显示正确的路径。

const DEBUG = process.env.NODE_ENV !== 'production'

module.exports = {
devtool: DEBUG ? 'cheap-module-source-map' : 'hidden-source-map'
}

如果你正在使用extract-text-webpack-plugin,可以用'source-map'替代,否则css的资源映射会不起作用。

// 只有当你使用extract-text-webpack-plugin时
module.exports = {
devtool: DEBUG ? 'source-map' : 'hidden-source-map'
}

同样的, 想要 webpack:///path/to/foo.js这样清晰的路径,我们可以写成下面这样:

output: {
devtoolModuleFilenameTemplate: 'webpack:///[absolute-resource-path]'
}

参考链接: devtool documentation

输出css文件

这是一个复杂的过程,你可以在这里找到答案。(译者注:这篇指南目前还没有翻译。)

开发模式

你想要某些配置只存在于开发环境中吗?

const DEBUG = process.env.NODE_ENV !== 'production'

// Webpack 1
module.exports = {
debug: DEBUG ? true : false,
devtool: DEBUG ? 'cheap-module-eval-source-map' : 'hidden-source-map'
} // Webpack 2
module.exports = {
devtool: DEBUG ? 'cheap-module-source-map' : 'hidden-source-map'
}

在webpack 1中,打包你的项目资源时,通过 env NODE_ENV=production webpack -p 来调用webpack命令。
而在webpack 2中,只要webpack -p就可以了,因为webpack自动帮你设置了NODE_ENV

分析包的大小

你想知道资源包中有哪些“重量级”依赖吗?使用webpack-bundle-size-analyzer吧。

$ yarn global add webpack-bundle-size-analyzer

$ ./node_modules/.bin/webpack --json | webpack-bundle-size-analyzer
jquery: 260.93 KB (37.1%)
moment: 137.34 KB (19.5%)
parsleyjs: 87.88 KB (12.5%)
bootstrap-sass: 68.07 KB (9.68%)
...

如果你正在生成资源映射,你也可以使用source-map-explorer,它能够独立于webpack工作。

$ yarn global add source-map-explorer

$ source-map-explorer bundle.min.js bundle.min.js.map

参考链接:
webpack-bundle-size-analyzer
source-map-explorer

更小的react项目

react会默认生成一些开发工具,而在生产环境中你并不需要它们。使用EnvironmentPlugin来让他们人道毁灭吧。这大概会节约30kb左右的空间。

plugins: [
new webpack.EnvironmentPlugin({
NODE_ENV: 'development'
})
]

在webpack 1中,使用env NODE_ENV=production webpack -p命令启动webpack来打包资源。而在webpack 2中,只要webpack -p就可以了,理由略。

参考链接: EnvironmentPlugin documentation

更小的Lodash

Lodash 非常有用,但是我们通常用到的只是其功能中的沧海一粟。 lodash-webpack-plugin 可以使用noop, identity或其他更简化的选项来替换 feature sets,来帮助你减少lodash占用的空间。

const LodashModuleReplacementPlugin = require('lodash-webpack-plugin');

const config = {
plugins: [
new LodashModuleReplacementPlugin({
path: true,
flattening: true
})
]
};

这种方法可以帮助你省下至少10kb。如果你的项目中lodash的比重很高,那你节省的资源会更多。

引入文件夹中所有文件

你是不是曾经尝试过下面的代码却发现不起作用?

require('./behaviors/*')  /* 看似很正确 */

事实上,你应该使用require.context。

// http://stackoverflow.com/a/30652110/873870
function requireAll (r) { r.keys().forEach(r) } requireAll(require.context('./behaviors/', true, /\.js$/))

参考链接: require.context

清除extract-text-webpack-plugin日志

如果你在使用extract-text-webpack-plugin时看过下面的调试日志:

Child extract-text-webpack-plugin:
+ 2 hidden modules
Child extract-text-webpack-plugin:
+ 2 hidden modules
Child extract-text-webpack-plugin:
+ 2 hidden modules

你可以使用stats: { children: false }来关闭它:

/* webpack.config.js */
stats: {
children: false,
},

参考链接: extract-text-webpack-plugin#35

总结

以上就是rstacruz总结的13条关于webpack的建议,这几乎是所有项目都用得到的Webpack配置技巧吧~

大多数项目中会用到的webpack小技巧的更多相关文章

  1. vue项目中postcss-pxtorem的使用及webpack中的配置 css中单位px和em,rem的区别

    移动手机版要求我们在制作嵌入h5的时候去适配不同的手机.适配有多重模式,有flex.百分比等.字体大小的控制也有px.百分比.rem等单位,webpack中 px转rem. vue项目中postcss ...

  2. [转]11个教程中不常被提及的JavaScript小技巧

    原文地址: https://www.cnblogs.com/ld1024/p/10723827.html 这次我们主要来分享11个在日常教程中不常被提及的JavaScript小技巧,他们往往在我们的日 ...

  3. 11个教程中不常被提及的JavaScript小技巧

    这次我们主要来分享11个在日常教程中不常被提及的JavaScript小技巧,他们往往在我们的日常工作中经常出现,但是我们又很容易忽略. 1.过滤唯一值 Set类型是在ES6中新增的,它类似于数组,但是 ...

  4. 「Python-Django」Django中使用数据库的 9 个小技巧

    Django 中使用数据库的 9 个小技巧. 1. 过滤器聚合 在 Django 2.0 之前,如果你想得到“用户总数”.“活跃用户总数”等信息时,你不得不使用条件表达式. Django 2.0 中, ...

  5. Win10 UWP开发中的重复性静态UI绘制小技巧 1

    介绍 在Windows 10 UWP界面实现的过程中,有时会遇到一些重复性的.静态的界面设计.比如:画许多等距的线条,画一圈时钟型的刻度线,同特别的策略排布元素,等等. 读者可能觉得这些需求十分简单, ...

  6. Win10 UWP开发中的重复性静态UI绘制小技巧 2

    小技巧1 地址:http://www.cnblogs.com/ms-uap/p/4641419.html 介绍 我们在上一篇博文中展示了通过Shape.Stroke族属性实现静态重复性UI绘制,使得U ...

  7. 工作中MySql的了解到的小技巧

    工作中MySql的小技巧 1. 跑脚本时,经常遇到有则更新无插入的 逻辑操作:通常情况下,来一波if()判断然后选择 更新还是插入,前两天逛论坛时发现有人在比较REPLACE INTO 和 INSET ...

  8. 项目中常用的19条MySQL优化技巧

    原文:https://segmentfault.com/a/1190000012155267 声明一下:下面的优化方案都是基于 “ Mysql-索引-BTree类型 ” 的 一.EXPLAIN 做My ...

  9. 安卓项目中使用JSON引发的一个小错误 Multiple dex files define Lorg/apache/commons/collections/Buffer

    原因: 这里添加的jar包和android自带的jar产生了冲突

随机推荐

  1. Git内部原理(1)

    Git本质上是一套内容寻址文件系统,在此之上提供了VCS的用户界面. Git底层命令(plumbing) vs 高层命令(porcelain) Git的高层命令包括checkout.branch.re ...

  2. 吴裕雄--天生自然python学习笔记:python 用 Tesseract 识别验证码

    用 Selenium 包实现网页自动化操作的案例中,发现很多网页都因 需输入图形验证码而导致实验无法进行 . 解决的办法就是对验证码进行识别 . 识 别的方法之 一 是通过图形处理包将验证码的大部分背 ...

  3. 吴裕雄--天生自然 JAVA开发学习:多线程编程

    class RunnableDemo implements Runnable { private Thread t; private String threadName; RunnableDemo( ...

  4. 系统学习javaweb4----CSS层叠样式表(结束)

    摘要:这几天临近过年,事情有点多,学习总是段段续续的,今天总算完成了CSS的基本知识学习. 学习笔记: 西瓜学习javaweb 1.css简述. 1.1 css是什么?有什么作用? HTML----- ...

  5. wait操作接口

    1.等待回收的两个函数wait()和waitpid()函数 1.1 wait(int *status)的用法:阻塞函数,等待任意一个子进程的返回.   *wait(NULL):对子进程的结束状态不关心 ...

  6. 《C程序设计语言》练习 1-8,1-9

    #include <stdio.h> /*编写一个统计空格,制表符与换行符个数的程序*/ main() { int a,b,c,d;//a表示空格个数,b表示制表符个数,c表示换行符个数 ...

  7. Ubuntu 12.04 编译bcm93349dcm软件包

    1.准备工作操作系统:Ubuntu 12.04 获取bcm93349dcm软件包: bootloader源代码:Bootloader_2_2_0.zip CM源代码:ProdD20_BFC4.4.10 ...

  8. python en(de)code

    python爬虫 代码写挺长的,也是边学边写,但一直搞不清楚python的encode(编码)和decode(解码).以下是我的探究之路. 一.当然先看官方文档 地址如下 里面提到encode函数'R ...

  9. 75)PHP,session在使用时的一些语法问题

    (1)cookie仅能存字符串类型,但是session能存任何数据类型,比如: 然后我在session_2.php中输出这个session_1.php的数据: 结果展示: 我得在浏览器的地址栏中先请求 ...

  10. python语法基础-函数-递归函数-长期维护

    ###############    递归   ############## # 递归的定义——在一个函数里再调用这个函数本身 # 递归的最大深度——998 # 二分查找算法 # 你观察这个列表,这是 ...