大多数项目中会用到的webpack小技巧

时间: 2017-12-01阅读: 3214标签: webpack

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

进度汇报

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

压缩

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

webpack -p

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

process.env.NODE_ENV === 'production'

复数文件打包

通过设置output属性为[name].js来导出复数包。下面的例子将会生成a.js和b.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-map 和 eval-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 可以使用noopidentity或其他更简化的选项来替换 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配置技巧吧~

站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/208

让IDE识别webpack的别名alias

许多项目脚手架默认就会把src目录添加一个@别名,项目中实际引入时,虽然可以精简路径,但也带来一个很麻烦的问题:IDE无法识别这些别名,因此导致无法自动完成路径、无法识别引用资源的输出、出现不必要的告警等情况。

解决-webkit-box-orient: vertical在webpack打包后丢失问题

该方式比较合适WebKit浏览器或移动端(绝大部分是WebKit内核的)浏览器。但是在现在一些框架中如(Vue,react项目中使用),会发现本地正常,打包线上后,该属性丢失

浅谈webpack优化

由于前端的快速发展,相关工具的发展速度也是相当迅猛,各大框架例如vue,react都有自己优秀的脚手架工具来帮助我们快速启动一个新项目,也正式因为这个原因,我们对于脚手架中最关键的一环webpack相关的优化知之甚少

webpack是什么?

webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle

手把手教你写一个 Webpack Loader

webpack 只能理解 JavaScript 和 JSON 文件。loader 让 webpack 能够去处理其他类型的文件,并将它们转换为有效模块,以供应用程序使用,以及被添加到依赖图中。

你必须知道的webpack插件原理分析

在 webpack 中,专注于处理 webpack 在编译过程中的某个特定的任务的功能模块,可以称为插件。它和 loader 有以下区别:loader 是一个转换器,将 A 文件进行编译成 B 文件,比如:将 A.less 转换为 A.css,单纯的文件转换过程。webpack 自身只支持 js 和 json 这两种格式的文件

webpack—url-loader 解决项目中图片打包路径问题

刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不能打包进我们的目标文件夹里。下面我们就来分析下在webpack项目中图片的应用场景。

Vue -- webpack 项目自动打包压缩成zip文件

这段时间用 Vue2.0 开发项目,每次打包都会用到 npm run build 命令,但是每次部署时给后端发包都要手动zip压缩,这样一两次还行,但遇到项目板块测试和临时加急功能测试的时候,一天可能就要打包好多次,这就很烦了。

webpack 构建多页面应用初探

如何使用webpack构建多页面应用,这是一个我一直在想和解决的问题。网上也给出了很多的例子,很多想法。猛一看,觉得有那么点儿意思,但仔细看也就那样。使用webpack这个构建工具,可以使我们少考虑很多的问题。

Webpack知识点

Webpack从基础概念到项目配置,涉及知识点较多,现将学习使用过程中遇到内容记录下来,方便以后速查。Webpack是一个模块打包工具,在Webpack里一切文件皆模块。通过loader转换文件,通过plugin注入钩子

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!