webpac2.0发布之后,我还保持了一原创内容,盗版必究。转载请注明出处:www.tangshuang.net段时间的1.0版本的使用,但当我打算跟上【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net时代的时候,就不得不研究一下2.0。其实【本文受版权保护】本文版权归作者所有,未经授权不得转载。2.0和1.0的用法并没有非常大的不同,原创内容,盗版必究。【未经授权禁止转载】最大的不同莫过于配置时,一些选项更换了名著作权归作者所有,禁止商业用途转载。【本文受版权保护】字,所以1.0的配置文件是不能被2.0兼【未经授权禁止转载】【原创内容,转载请注明出处】容的。
著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net我之前的工作,大部分都是专注于compo本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】nent,而现在,我希望用webpack【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】来构建我的应用。所谓“应用级构建”,就是说要直接打包完上原创内容,盗版必究。【作者:唐霜】线运行。我自己开发的componer在构建阶段著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net,采用了js和css分开的方案,js用w【未经授权禁止转载】【原创内容,转载请注明出处】ebpack打包,css则利用gulp-【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】sass来分离,实际上,这是行得通的,因【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。为一个项目理应把js和css分开管理。不转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。过在这篇文章中,为了技术上的自鸣得意,我【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】还是采用webpack来编译scss打包原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.netcss。那么我们现在开始吧。
【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】本文作者:唐霜,转载请注明出处。【转载请注明来源】单文件入口【未经授权禁止转载】
【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【转载请注明来源】在这个项目中,我打算采用单文件入口。简单【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net的说,就是entry只给一个文件,只有一本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。个chunk。项目大致结构如下:
本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【本文受版权保护】【版权所有】唐霜 www.tangshuang.net-app |-script |-style |-template |-index.js |-index.html-components-package.json-webpack.config.babel.js-.babelrc
app就是我们本文要构建的项目,comp【版权所有】唐霜 www.tangshuang.net【转载请注明来源】onents目录下将会放各种组件,这就要转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net用到componer了。而index.j【本文受版权保护】【版权所有】唐霜 www.tangshuang.nets则是本文的入口文件,也就是说,我们只需【原创不易,请尊重版权】【原创不易,请尊重版权】要得到一个index.js即可。inde著作权归作者所有,禁止商业用途转载。【本文受版权保护】x.html将使用插件自动插入打包后的文【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。件链接。
原创内容,盗版必究。【转载请注明来源】【本文首发于唐霜的博客】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。为什么要单文件入口呢?作为一个项目,你只未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net需要关心你的项目内部的代码怎么组织就可以【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】了,不需要关心构建打包的入口文件。入口文原创内容,盗版必究。未经授权,禁止复制转载。件是单独撰写的,在你的项目内部不依赖它,本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】它只是作为打包入口使用。
原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net// index.js import './style/app.scss' import 'jquery'import 'bootstrap-sass' import './script/app.js'
上面就是入口文件了,入口文件告诉构建工具未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】,这个项目的样式、全局依赖、项目本身的脚【作者:唐霜】【原创不易,请尊重版权】本各是什么,直接把这个入口文件丢给web【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。pack,webpack就可以得到最终你【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。需要的build文件(js, css, 【关注微信公众号:wwwtangshuangnet】【作者:唐霜】assets分开)。
原创内容,盗版必究。【转载请注明来源】【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。【转载请注明来源】// webpack.config.babel.js
export default {
entry: './app/index.js',
output: {
filename: 'dist/js/[name].[chunkhash:8].js',
libraryTarget: 'umd',
},
}
支持ES6【关注微信公众号:wwwtangshuangnet】
【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。本文作者:唐霜,转载请注明出处。webpack2.x原生支持了impor本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。t进行模块导入,之所以这样,是因为web原创内容,盗版必究。【转载请注明来源】pack2有一个令人惊喜的功能:tree原创内容,盗版必究。【版权所有,侵权必究】 shaking,也就是仅导出被其他模块【版权所有,侵权必究】【未经授权禁止转载】导入的接口。举个例子:
【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net// a.js
export function a() {}
export function b() {}
// b.js
import {a} from './a'
如果项目中只有这两个文件,你在b.js中【转载请注明来源】转载请注明出处:www.tangshuang.net只用到了a.js中的a(),那么在web【未经授权禁止转载】本文作者:唐霜,转载请注明出处。pack打包后的文件里,你会发现导出接口【原创内容,转载请注明出处】【作者:唐霜】只有a,没有b,再不使用UglifyJs【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】Plugin优化的情况下,b()函数也不【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。是全局注册,性能消耗比以前导出b而不用要原创内容,盗版必究。【未经授权禁止转载】小。如果你使用UglifyJsPlugi【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。n进行优化,会发现最终优化的结果代码里面【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net没有函数b。
转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】这和es6的模块化方案的期待结果是一致的原创内容,盗版必究。本文作者:唐霜,转载请注明出处。。但是解决import, export的【未经授权禁止转载】【本文首发于唐霜的博客】模块化问题之后,并不代表webpack已【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。经可以编译es6代码了。实际上,和以前一【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。样,我们还是需要使用babel来编译es【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】6代码,保证得到的代码可以在更低版本的浏【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。览器运行。
未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。【作者:唐霜】和之前一样,我们要配置一个loader,未经授权,禁止复制转载。【本文首发于唐霜的博客】但是前面讲过,loader的配置名有变化【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net:
本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】转载请注明出处:www.tangshuang.net{
//...
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
loader: 'babel-loader',
options: {
presets: [
['env', { modules: false }]
],
},
},
],
},
optimization: {
usedExports: true,
sideEffects: true,
},
}
【原创不易,请尊重版权】
【未经授权禁止转载】【作者:唐霜】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】【本文受版权保护】本文版权归作者所有,未经授权不得转载。
【作者:唐霜】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。webpack想用上tree-shaki本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】ng,还要配置:
【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【本文受版权保护】【版权所有】唐霜 www.tangshuang.netoptimization: {
usedExports: true,
sideEffects: true,
},
webpack2默认情况下不允许省略-l原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。oader,不能像1.x时代一样直接使用本文作者:唐霜,转载请注明出处。原创内容,盗版必究。babel作为loader值就行。注意上【未经授权禁止转载】【原创不易,请尊重版权】面红色代码,它是一个整体,注意是一个数组本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】,数组元素类型还不一样。之所以要将mod【版权所有】唐霜 www.tangshuang.net【本文受版权保护】ules设置为false,是防止webp本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。ack的tree shaking功能发挥【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。之前,babel把import, exp著作权归作者所有,禁止商业用途转载。【转载请注明来源】ort转码为require,一旦babe【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.netl这样做了,tree shaking功能【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。就实现不了了。
【本文首发于唐霜的博客】【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】通过上面的配置,你就可以愉快的使用es6转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。代码来写js了。
转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】注意,你虽然可以使用es6代码,但是es【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。6新加入的特性Symbol是浏览器本来没【本文受版权保护】本文版权归作者所有,未经授权不得转载。有的,也没有polyfill可以用,所以【转载请注明来源】转载请注明出处:www.tangshuang.net基于Symbol的for..of, 著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。8230;等其实最好还是暂时不用,毕竟你【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net还是想兼容一些稍微更低一点的浏览器版本,【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】比如IE9. 当然,如果你想强迫用户使用本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】高版本浏览器,也可以完全不管这个限制。
【本文首发于唐霜的博客】原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。在js中直接使用bower compon【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。ents
本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net原创内容,盗版必究。基于组件的开发,components很多【转载请注明来源】本文作者:唐霜,转载请注明出处。都通过bower发布,当然,现在很多公司本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。都做了bower转npm,不过我认为bo本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】wer称自己的包为component而非转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。package或module是有道理的,著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】bower本身是从component出发【原创不易,请尊重版权】【未经授权禁止转载】的。而npm则不管那么多,任何形式的包都【版权所有,侵权必究】原创内容,盗版必究。可以。
本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。如何配置在webpack中使用bower转载请注明出处:www.tangshuang.net【转载请注明来源】包呢?
转载请注明出处:www.tangshuang.net【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。import BowerResolvePlugin from 'bower-resolve-webpack-plugin'
export default {
// ...
resolve: {
plugins: [
new BowerResolvePlugin(),
],
modules: [
'node_modules',
'bower_components',
'components',
],
descriptionFiles: [
'package.json',
'bower.json',
],
mainFields: [
'main',
],
},
}
上面的这个配置有点奇怪的,就是在reso【原创内容,转载请注明出处】未经授权,禁止复制转载。lve里面还传入了一个plugins。不转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】过你阅读文档就知道,这个plugins是本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。为resolver准备的。通过一个叫bo【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。wer-resolve-webpack-【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。plugin来解决bower.json中本文版权归作者所有,未经授权不得转载。【作者:唐霜】main字段是数组的情况。你去看这个插件本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】的源码,无非是通过对main字段进行检查著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】,获取后缀是.js的文件作为main字段著作权归作者所有,禁止商业用途转载。【本文受版权保护】的值。所以这个地方其实还是不是很好,因为【版权所有】唐霜 www.tangshuang.net【转载请注明来源】你可能发现有些bower包main字段不【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】规范,把.min.js和.js放在一起了【作者:唐霜】转载请注明出处:www.tangshuang.net,如果把.min.js放前面,就惨了。所本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。有bower包的发布者,都应该按照bow【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。er的specs文档来撰写bower.j本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。son,否则其实是互坑。
【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【转载请注明来源】通过上面的配置之后,你可以像使用node【作者:唐霜】【版权所有】唐霜 www.tangshuang.net_modules目录下的包一样使用bow【转载请注明来源】【未经授权禁止转载】er包。
转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。文件名hash注入【关注微信公众号:wwwtangshuangnet】
【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net在前面的配置代码中,你发现在filena【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】me中,我们加入了[chunkhash:8],[hash]和[chunkhash]不【关注微信公众号:wwwtangshuangnet】【作者:唐霜】同,[hash]是基于原始文件的,而[c【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。hunkhash]是基于chunk的。c【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】hunk的概念,你可以简单理解为“一捆文【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】件”,也就是好几个文件如果打包在一起,就【原创内容,转载请注明出处】【原创不易,请尊重版权】是一个chunk,webpack本来就是【转载请注明来源】【版权所有】唐霜 www.tangshuang.net打包,所以只要打包,就永远都有chunk【未经授权禁止转载】【未经授权禁止转载】。
下面我们会讲到vendors分离的问题。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。为什么要使用带hash文件名的文件名呢?本文版权归作者所有,未经授权不得转载。【转载请注明来源】主要是为了实现CDN,比如你把你的文件打【作者:唐霜】原创内容,盗版必究。包成连个,一个是vendors.js一个【转载请注明来源】转载请注明出处:www.tangshuang.net是main.js,都走CDN。现在你更新【转载请注明来源】本文作者:唐霜,转载请注明出处。了版本,vendors.js完全没变,而【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】main.js改变了,这个时候,由于浏览转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】器的缓存作用,用户只需要下载main.j【原创内容,转载请注明出处】【原创不易,请尊重版权】s就可以了。但是怎么实现呢?就是在文件名【转载请注明来源】本文作者:唐霜,转载请注明出处。中加hash,比如main.xxwwxs【转载请注明来源】【原创内容,转载请注明出处】2342.js,当你更新了版本,文件的h原创内容,盗版必究。【版权所有,侵权必究】ash值肯定就变了,文件名也就变成了ma【本文受版权保护】未经授权,禁止复制转载。in.newhashxxx.js。这样当本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。用户请应用的时候,就会下载这个新的脚本到本文版权归作者所有,未经授权不得转载。【转载请注明来源】本地。vendors也是同样的道理,要是【版权所有,侵权必究】【版权所有,侵权必究】你没有加入新vendor,可以不用被用户本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】重新下载,当你加入新vendor时,再通【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】过改变hash注入到文件名中来实现更新客原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】户端的脚本文件。
【版权所有】唐霜 www.tangshuang.net【转载请注明来源】【作者:唐霜】[hash]和[chunkhash]的不【未经授权禁止转载】本文作者:唐霜,转载请注明出处。同就是,如果你的整体文件没有变,只不过改本文版权归作者所有,未经授权不得转载。【转载请注明来源】变了vendors的内容,比如你觉得ve未经授权,禁止复制转载。【转载请注明来源】ndors.js太大了,把里面几个ven【未经授权禁止转载】【本文受版权保护】dor分到main.js里面,这个时候打【作者:唐霜】本文版权归作者所有,未经授权不得转载。包出来两个文件的[hash]是一样的(是【本文首发于唐霜的博客】【转载请注明来源】原始文件的hash),[chunkhas【原创内容,转载请注明出处】原创内容,盗版必究。h]则不同(是各自chunk的hash)原创内容,盗版必究。【作者:唐霜】。
【关注微信公众号:wwwtangshuangnet】【转载请注明来源】著作权归作者所有,禁止商业用途转载。只需要在输出文件的字符串中使用[chun本文作者:唐霜,转载请注明出处。【未经授权禁止转载】khash]作为占位符即可。
原创内容,盗版必究。【作者:唐霜】转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【原创内容,转载请注明出处】实现vendors脚本分离【本文首发于唐霜的博客】
【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net【作者:唐霜】本文作者:唐霜,转载请注明出处。在《【转载请注明来源】webpack将依赖和项目分开各自单独【未经授权禁止转载】》一文中,我介绍了使用Dll方案将ven本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】dors从应用自己的逻辑代码中分离出去单【版权所有,侵权必究】原创内容,盗版必究。独打包的一种方案。但是Dll方案更适合测本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。试开发阶段,你想,当你测试的适合,其实更【作者:唐霜】著作权归作者所有,禁止商业用途转载。多是在写项目本身的逻辑代码,而且每次改完【未经授权禁止转载】【版权所有,侵权必究】都希望自动刷新一下页码,看到效果。Dll著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】方案分两步走,第一步打包所有指定的ven原创内容,盗版必究。【作者:唐霜】dors,这时会得到一个json文件,第本文作者:唐霜,转载请注明出处。【转载请注明来源】二步利用这个json文件,把项目内的代码【版权所有,侵权必究】【本文首发于唐霜的博客】中对应的那些vendors全部剔除掉,使【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】用webpack内建的json机制让ve【原创不易,请尊重版权】未经授权,禁止复制转载。ndors依赖可以被后一个文件识别到。这【版权所有,侵权必究】【作者:唐霜】样你每次修改完代码,只需要重复执行第二步【原创不易,请尊重版权】【作者:唐霜】即可,这样要打包的代码量就小很多了。
【未经授权禁止转载】转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】但是本文要介绍【版权所有】唐霜 www.tangshuang.netCommonsChunkPlugin本文作者:唐霜,转载请注明出处。这个插件,它就更适合产品阶段打包,因为它转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。每次都会对所有代码进行打包,在打包过程中本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】,通过插件来决定哪些vendors要分离原创内容,盗版必究。【本文受版权保护】出来。但是你可以很容易发现,就算webp著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。ack内部有缓存机制,CommonsChunkPlugin【版权所有】唐霜 www.tangshuang.net分离代码始终要读取所有文件,所以总体效率未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。上讲,肯定还是只重复Dll方案第二步更高【原创内容,转载请注明出处】【原创内容,转载请注明出处】一些。不过在应用打包层面,这个就可以不考【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】虑了,因为你现在都打算最后一次打包了,马【本文首发于唐霜的博客】原创内容,盗版必究。上就要上线了,还会在乎这几秒钟吗?
著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】接下来就正式进入【访问 www.tangshuang.net 获取更多精彩内容】CommonsChunkPlugin【转载请注明来源】的讲解。【原创不易,请尊重版权】
【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net{
// ...
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'vendors',
minChunks: (mod, count) => {
// this is used to pick out vendors
let resource = mod.resource
if(resource && (/^.*\.(css|scss)$/).test(resource)) {
return false
}
let context = mod.context
if(!context) return false
if(context.indexOf('node_modules') === -1 && context.indexOf('bower_components') === -1) return false
return true
},
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest', //But since there are no more common modules between them we end up with just the runtime code included in the manifest file
}),
],
}
这……配置量也太少了吧。就在plugin原创内容,盗版必究。【转载请注明来源】s里面加了两个项目,而且还是重复使用了CommonsChunkPlugin【版权所有,侵权必究】。配置量虽然少,但是里面的学问却很大。【版权所有,侵权必究】
原创内容,盗版必究。【转载请注明来源】著作权归作者所有,禁止商业用途转载。【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】首先还是介绍一下原创内容,盗版必究。CommonsChunkPlugin【本文首发于唐霜的博客】这个插件的理念吧。这里要涉及webpac转载请注明出处:www.tangshuang.net【未经授权禁止转载】k的一个code splitting的概【本文受版权保护】原创内容,盗版必究。念。具体请阅读官方文档【版权所有】唐霜 www.tangshuang.net,我这里大致讲下。【原创不易,请尊重版权】
【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。原创内容,盗版必究。所谓code splitting(代码切【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。分)是开发中经常要遇到的问题。当你的项目原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。代码全部打包在一个文件中时,这个文件可能【作者:唐霜】原创内容,盗版必究。撑的很大,可能到几M,甚至几十M,虽然我【本文受版权保护】未经授权,禁止复制转载。们说合并多个js文件的代码到单个文件里面转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net,有利于减少http请求并行数量,提高页【转载请注明来源】【原创不易,请尊重版权】面打开速度。但是你这一个文件几十M,你以转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。为中国网速都是千兆光纤吗?要是别人用4G原创内容,盗版必究。【原创不易,请尊重版权】,你这是要三两下把别人一个月套餐用完的节【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】奏啊!而且文件的下载时长,虽然受http【版权所有,侵权必究】原创内容,盗版必究。影响(http2就不会有这个问题了),但原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net是文件的大小太大,我想下载时长肯定更长啊本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】!所以,原本流行的合并代码的理念,到了w【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】ebpack的时代,切分理念又开始盛行。著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】把你的代码切分为2-3个文件,到了htt本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.netp2的时代,甚至可以按需加载,这样可以加未经授权,禁止复制转载。【本文首发于唐霜的博客】快文件下载。
【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】【本文首发于唐霜的博客】切分的依据,我简单的定为把所有静态不会修【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。改的第三方依赖作为一个,项目本身的文件作【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net为一个。所以,我们希望打包完之后,在我们【转载请注明来源】【作者:唐霜】的dist/js目录下,可以有两个js,原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】一个是main.js一个是vendors【本文受版权保护】未经授权,禁止复制转载。.js。
原创内容,盗版必究。【原创内容,转载请注明出处】【作者:唐霜】原创内容,盗版必究。我们现在再来看上面的配置。【本文首发于唐霜的博客】
转载请注明出处:www.tangshuang.net【作者:唐霜】本文作者:唐霜,转载请注明出处。 // ...
new webpack.optimize.CommonsChunkPlugin({
name: 'vendors',
minChunks: (mod, count) => {
// this is used to pick out vendors
let context = mod.context
if(!context) return false
if(context.indexOf('node_modules') === -1 && context.indexOf('bower_components') === -1) return false
return true
},
}),
这是第一个common chunk。它有本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。一个name和一个minChunks,n本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。ame是指你打算把哪一个chunk切分出【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。来,这里输入了vendors,但是你往前未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】翻,发现我们采用的是单文件入口,没有ve转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】ndors这个入口啊?没关系,我们来看m【作者:唐霜】【关注微信公众号:wwwtangshuangnet】inChunks。不过可以透露的是,ve【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。ndors决定了最后切分出来的文件名。
转载请注明出处:www.tangshuang.net原创内容,盗版必究。本文作者:唐霜,转载请注明出处。【未经授权禁止转载】【本文受版权保护】minChunks本来的意思是,当一个模【作者:唐霜】本文版权归作者所有,未经授权不得转载。块在应用的所有代码中被引用了>=m【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.netinChunks的时候,才会被split【作者:唐霜】【原创不易,请尊重版权】出来。也就是说,如果你把minChunk【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】s设置为Infinity,那么任何模块都【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。不会被单独分出来了,因为引用次数肯定是有【版权所有】唐霜 www.tangshuang.net【本文受版权保护】限次啊。如果你设置为1,那所有的模块都会【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。被放到vendors.js中(除了入口文【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】件本身)。总之,它的作用可以让webpa本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.netck决定哪些module要被单独分离出来转载请注明出处:www.tangshuang.net【未经授权禁止转载】。
【原创不易,请尊重版权】未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】有了这个之后,我们实际上不考虑次数的问题本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】,我们希望的是,所有在node_modu【未经授权禁止转载】转载请注明出处:www.tangshuang.netles和bower_components著作权归作者所有,禁止商业用途转载。【转载请注明来源】目录下的包都被分出来。所以我们采用了给m【本文受版权保护】【原创内容,转载请注明出处】inChunks传一个函数的形式来处理。【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】这个函数返回为true,则被分离出来,为【作者:唐霜】【版权所有】唐霜 www.tangshuang.netfalse则保留在原来的chunk中。
【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】【转载请注明来源】所以,你现在应该可以看到那个函数了吧。【作者:唐霜】
本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】接下来,解释为什么有第二个【本文受版权保护】CommonsChunkPlugin原创内容,盗版必究。实例。未经授权,禁止复制转载。
【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。【转载请注明来源】虽然【未经授权禁止转载】CommonsChunkPlugin【版权所有】唐霜 www.tangshuang.net可以帮助我们分离代码出来,但是,我们还会本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net采用hash文件的后缀,这样当你在htm原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】l中引用这个bundle时,文件名不一样转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net,就会下载新的bundle。但是如果你只未经授权,禁止复制转载。【版权所有,侵权必究】使用上面的第一个CommonsChunkPlugin著作权归作者所有,禁止商业用途转载。实例的话,你会发现,每次vendors的【版权所有,侵权必究】【本文首发于唐霜的博客】文件hash也不一样,所以到最后,你发现本文版权归作者所有,未经授权不得转载。【本文受版权保护】你的用户浏览器还是会下载main.[ch【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.netunkhash].js和vendors.【未经授权禁止转载】原创内容,盗版必究。[chunkhash].js两个文件,本转载请注明出处:www.tangshuang.net【转载请注明来源】来打算只更新main.js的,这样用户可本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。以更快获取最新代码。这是为什么呢?
【版权所有,侵权必究】【原创不易,请尊重版权】【转载请注明来源】本文作者:唐霜,转载请注明出处。网上有专门的文章来介绍这个问题,上面给的【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】官方文档链接里也有说。大概意思就是web【本文受版权保护】未经授权,禁止复制转载。pack内部有缓存机制,每次CommonsChunkPlugin【原创内容,转载请注明出处】切分代码都会产生新的id号作为缓存,所以本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】每次得到的vendors.js的内容都不本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。同,所以每次chunkhash也不同,这【转载请注明来源】【版权所有】唐霜 www.tangshuang.net就惨了,CDN的功效失效了。
【转载请注明来源】【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】解决办法就是再在plugins里面加一个转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.netnew CommonsChunkPlugin。【作者:唐霜】
【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net原创内容,盗版必究。 // 前一个new CommonChunkPlugin
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest', //But since there are no more common modules between them we end up with just the runtime code included in the manifest file
}),
因为【作者:唐霜】CommonsChunkPlugin【版权所有】唐霜 www.tangshuang.net会把这些新产生的id记录在最后一个产生的转载请注明出处:www.tangshuang.net【转载请注明来源】chunk里面,new一个新的会产生一个本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】新文件,也就是说除了vendors.js【转载请注明来源】原创内容,盗版必究。和main.js之外,你会发现还有一个m【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】anifest.js文件。
【本文受版权保护】【版权所有,侵权必究】【版权所有,侵权必究】【转载请注明来源】本文作者:唐霜,转载请注明出处。只传了一个name,作为bundle文件【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。名,没有给minChunks规则,这样在著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。这个chunk里,不会存在实际的文件业务【转载请注明来源】【版权所有】唐霜 www.tangshuang.net逻辑代码,只是一个非常小的文件,但是它是【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】必须的,必须在vendors.js和ma原创内容,盗版必究。本文作者:唐霜,转载请注明出处。in.js之前被引入到网页。
【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】其实这个方案有一个不好的地方,是会产生三【原创不易,请尊重版权】原创内容,盗版必究。个文件,而且最后这个manifest.j未经授权,禁止复制转载。【转载请注明来源】s根本不是我想要的,我只想要前两个问题。原创内容,盗版必究。【本文首发于唐霜的博客】但是没办法,webpack内部的一些机制未经授权,禁止复制转载。【原创不易,请尊重版权】限制了,只能这么做,再说了最后这个文件非【本文受版权保护】著作权归作者所有,禁止商业用途转载。常小,下载速度会非常快。
【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】有了第三个文件的出现,你会神奇的发现,怎【未经授权禁止转载】本文作者:唐霜,转载请注明出处。么改app里面的业务逻辑代码,vendo著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。rs.js的chunkhash都不变了。【未经授权禁止转载】原创内容,盗版必究。这样就起到了我们想要的CDN效果。
【作者:唐霜】【本文受版权保护】原创内容,盗版必究。把脚本插入到html文档中原创内容,盗版必究。
【作者:唐霜】本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】之所以要有这一步,是因为我们可以更快的使【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】用[chunkhash]。如果不自动插入【本文受版权保护】【作者:唐霜】html,那么你必须去看dist/js目【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。下生成的新的js文件,把文件名抄过来,填【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。写到你的index.html中去。但是如未经授权,禁止复制转载。未经授权,禁止复制转载。果自动生成了html,那么最多ctrl 转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。c+v一下。如果处理的好,还根本不用自己【版权所有,侵权必究】转载请注明出处:www.tangshuang.net动手,我们自己来写个模板,让webpac本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.netk自动插入脚本到html中就可以了。
【本文受版权保护】著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。import HtmlWebpackPlugin from 'html-webpack-plugin'
// ...
export default {
plugins: [
// ...
new HtmlWebpackPlugin({
filename: 'dist/index.html',
template: 'app/index.html',
chunksSortMode: (chunk1, chunk2) => {
let orders = ['manifest', 'vendors', 'main']
let order1 = orders.indexOf(chunk1.names[0])
let order2 = orders.indexOf(chunk2.names[0])
return order1 > order2 ? 1 : order1 < order2 ? -1 : 0
},
}),
],
}
其他的都好理解chunksSortMod【未经授权禁止转载】【本文受版权保护】e要解释一下。它的值是一个函数,将会被传【本文受版权保护】【版权所有】唐霜 www.tangshuang.net入sort方法,Array.sort你应【原创不易,请尊重版权】【转载请注明来源】该了解它的效果。之所以要使用chunks著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】SortMode参数,是因为如果不传,你本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】会发现插入到index.html的脚本顺原创内容,盗版必究。本文作者:唐霜,转载请注明出处。序是反的,main.js在最前面,如果直原创内容,盗版必究。【本文受版权保护】接运行index.html的话,浏览器会【本文首发于唐霜的博客】未经授权,禁止复制转载。报错。
【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【原创不易,请尊重版权】使用scss【版权所有】唐霜 www.tangshuang.net
【本文受版权保护】原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】接下来的内容,将会讨论style。在我的【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】项目中,全部使用了scss,所以我需要对本文作者:唐霜,转载请注明出处。【作者:唐霜】我的样式进行预编译和打包处理。配置也非常【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net简单,使用sass-loader即可,当本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】然,需要css-loader配合,开发模【转载请注明来源】转载请注明出处:www.tangshuang.net式下还需要style-loader配合。
【本文受版权保护】【原创内容,转载请注明出处】【本文受版权保护】【本文首发于唐霜的博客】{
module: {
rules: [
{
test: /\.scss$/,
use: ['css-loader', 'style-loader', 'sass-loader'],
},
],
},
}
css-loader的作用是使得webp【版权所有,侵权必究】【作者:唐霜】ack可以正确识别scss文件路径,包括【未经授权禁止转载】转载请注明出处:www.tangshuang.net@import语法的引用路径。style【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。-loader的作用是可以让最后的css转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】样式直接通过js插入到页面头部,这在开发【未经授权禁止转载】转载请注明出处:www.tangshuang.net时非常好用,甚至可以实现热替换。sass【本文受版权保护】【版权所有】唐霜 www.tangshuang.net-loader的作用不用说,当然是编译s著作权归作者所有,禁止商业用途转载。【转载请注明来源】css。
【转载请注明来源】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net在scss中直接使用package mo著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】dules
【转载请注明来源】【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】就像在js里面直接import modu本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】le一样,我们可以通过本节的方法,直接在【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】scss中直接使用module,例如:
原创内容,盗版必究。未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。本文作者:唐霜,转载请注明出处。@import "bootstrap-sass";
这就很屌了,它跟js的用法非常像了。不过【原创不易,请尊重版权】【版权所有,侵权必究】要这样用,还得要求被import的mod【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。ule的package.json文件中使【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。用sass字段指明哪一个是你要用的scs本文作者:唐霜,转载请注明出处。【转载请注明来源】s文件,通过这个字段指明,解析成真正的s【本文受版权保护】【原创内容,转载请注明出处】css文件路径。
未经授权,禁止复制转载。【本文受版权保护】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】其实sass-loader自己就提供了m【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。odule检索的方法,但是需要在modu未经授权,禁止复制转载。【原创内容,转载请注明出处】le前面加入一个~符号,比如:
本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。@import "~bootstrap-sass/assets/stylesheets/_bootstrap.scss";
这种方式是sass-loader自带支持【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】的,不需要插件。不过~只支持引用文件的形【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。式,不支持直接传入module名称,所以【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】就达不到我们的需求,我们希望@impor【作者:唐霜】【本文首发于唐霜的博客】t像js中使用import一样方便。
转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。而有幸,又有一个插件帮助我们完成这个目的【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】,它是一个node-sass的impor本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。ter插件:sass-module-im【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。porter。废话不多说,下面直接进入配原创内容,盗版必究。转载请注明出处:www.tangshuang.net置方法:
【版权所有,侵权必究】【未经授权禁止转载】【版权所有,侵权必究】未经授权,禁止复制转载。import SassModuleImporter from 'sass-module-importer'
// ...
export default {
module: {
rules: [
{
test: /\.scss$/,
use: ['css-loader', 'style-loader', {
loader: 'sass-loader',
options: {
importer: SassModuleImporter(),
},
}],
},
],
},
}
我们使用到了sass-module-im【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.netporter这个插件,非常屌。你只需要像【本文受版权保护】转载请注明出处:www.tangshuang.net上面这样,传入importer作为sas【关注微信公众号:wwwtangshuangnet】【转载请注明来源】s-loader,sass-loader【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net最终会把这个配置项传给node-sass本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。,node-sass又传给libsass【关注微信公众号:wwwtangshuangnet】【本文受版权保护】,总之它生效了,你直接可以像前面说的一样【本文受版权保护】【转载请注明来源】使用bootstrap-sass了。
著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】但是在js里面还有另外一种引用方式啊,比原创内容,盗版必究。【转载请注明来源】如:
转载请注明出处:www.tangshuang.net【未经授权禁止转载】未经授权,禁止复制转载。转载请注明出处:www.tangshuang.netimport 'module/subdir/subsubdir/file.js'
在sass里面怎么搞?如你想象,直接引用【原创不易,请尊重版权】未经授权,禁止复制转载。文件即可:
本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【本文受版权保护】【原创不易,请尊重版权】未经授权,禁止复制转载。@import "bootstrap-sass/assets/stylesheets/_bootstrap.scss";
是不是很神奇。这让我们非常轻松的在js和转载请注明出处:www.tangshuang.net【作者:唐霜】scss的module引入写法之间无缝切【版权所有,侵权必究】【版权所有,侵权必究】换。
【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】有一个点需要稍微阐述一下,sass-mo转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】dule-importer这个插件会检索【转载请注明来源】【原创内容,转载请注明出处】node_modules和bower_c【本文受版权保护】【原创不易,请尊重版权】omponents目录下的所有包。当你只【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net是import包名的时候,如果是在nod【原创不易,请尊重版权】【原创不易,请尊重版权】e_modules目录下,就会去找pac原创内容,盗版必究。【原创内容,转载请注明出处】kage.json,去查main, sa著作权归作者所有,禁止商业用途转载。【本文受版权保护】ss, style这几个字段,找到scs著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。s文件路径,如果package.json【作者:唐霜】原创内容,盗版必究。中这几个字段都没有对应的scss文件入口转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net,那么编译就会报错。同样的情况,在bow转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。er_components中,因为我们可未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】以让main字段以数组的形式展示,所以插【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。件会先去查找bower.json中的ma【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.netin字段,如果没有找到对应的scss文件【作者:唐霜】【原创不易,请尊重版权】入口,也会报错。所以在你自己发布一个包的【本文受版权保护】【版权所有,侵权必究】时候,应该注意这个点。
【转载请注明来源】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。不过有些组件没有提供pacakge.js【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】on的sass字段,你也只能选这种方案。【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net所以根据你自己的情况来选择吧。
【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。【本文受版权保护】未经授权,禁止复制转载。补充:后来我发现,其实并不需要借助sas【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。s module importer插件,本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。sass-loader的配置选项中有一个【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】includePaths可以进行配置,这【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net个选项告诉sass-loader把哪些文【本文首发于唐霜的博客】【作者:唐霜】件目录作为查找的根目录,所以要实现这一小【原创不易,请尊重版权】原创内容,盗版必究。节的需求,不再需要插件,而是直接如下配置著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。:
【原创内容,转载请注明出处】原创内容,盗版必究。【本文受版权保护】【转载请注明来源】转载请注明出处:www.tangshuang.netexport default { module: { rules: [ { test: /\.scss$/, use: ['css-loader', 'style-loader', { loader: 'sass-loader', options: { includePaths: [ path.resolve(__dirname, 'node_modules'), path.resolve(__dirname, 'bower_components'), ], }, }], }, ], }, }通过上面的配置,sass-loader可原创内容,盗版必究。【本文受版权保护】以直接在这两个文件夹中搜索要找的scss本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。 module,这样就不需要~符帮助。
转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【未经授权禁止转载】【原创内容,转载请注明出处】【转载请注明来源】
将样式保存到独立的css文件【版权所有】唐霜 www.tangshuang.net
【本文受版权保护】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】【版权所有,侵权必究】【原创不易,请尊重版权】前面提到过,单文件入口的好处是,你可以直本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net接从入口文件中知道你的项目所用到的样式有【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】哪些,不过虽然入口是单一的,但是最终出来【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。的文件可必须是分开的,这样才能充分发挥各【版权所有】唐霜 www.tangshuang.net【本文受版权保护】自的优势。
未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net
前面已经实现了vendors js的切本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】分,现在,我们要把所有css从js里面分【本文受版权保护】【本文首发于唐霜的博客】离出来。前面忘记说两件事:
- 通过css-loader打包的css,会原创内容,盗版必究。未经授权,禁止复制转载。被全部放在js文件里面,当做一个模块,再著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。由style-loader加载到页面中,本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。这跟我们直接在js里面写css有点像 【本文受版权保护】【版权所有,侵权必究】【版权所有,侵权必究】【原创内容,转载请注明出处】
- 如果你的vendors里面也有样式,比如未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。你的某个vendor就是使用requir【转载请注明来源】著作权归作者所有,禁止商业用途转载。e(‘./xx.css【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。217;),你怎么办?只能让它打包进js【转载请注明来源】本文版权归作者所有,未经授权不得转载。里面咯。 本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【作者:唐霜】【版权所有,侵权必究】【本文受版权保护】
上面说的第2点再展开一下。之前在开发co【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。mponer的时候使用了一个插件,可以把【本文首发于唐霜的博客】原创内容,盗版必究。bower里面的css也引进来,跟本文的【本文受版权保护】【关注微信公众号:wwwtangshuangnet】实现不一样,它可以把main字段里面的c【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。ss文件也require进来,这样打包的未经授权,禁止复制转载。【原创不易,请尊重版权】时候,就不会把css漏掉,这其实挺好的。
【本文首发于唐霜的博客】【本文受版权保护】
但是,现在我们要把所有打包进来的css【作者:唐霜】著作权归作者所有,禁止商业用途转载。给分离出去,到一个单独的css文件中,作【版权所有】唐霜 www.tangshuang.net【本文受版权保护】为静态文件保存。少说废话,直接看配置:
import ExtractTextPlugin from 'extract-text-webpack-plugin'
export default {
entry: './app/index.js',
output: {
filename: 'dist/js/[name].[chunkhash:8].js',
libraryTarget: 'umd',
},
module: {
rules: [
{
test: /\.scss$/,
use: ExtractTextPlugin.extract({
use: ['css-loader', {
loader: 'sass-loader',
options: {
importer: SassModuleImporter(),
},
},
],
fallback: 'style-loader',
}),
},
],
},
// ...
plugins: [
new ExtractTextPlugin({
filename: 'dist/css/[name].[chunkhash:8].css',
allChunks: true,
}),
],
}
我们用到了extract-text-we【版权所有,侵权必究】未经授权,禁止复制转载。bpack-plugin这个插件。它分两著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】个步骤,一个是在plugins里面实例化【作者:唐霜】本文版权归作者所有,未经授权不得转载。,另一个是在loader中调用extra【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】ct方法。extract方法的参数其实又【版权所有,侵权必究】【转载请注明来源】是loaders,表示在提取css之前应【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net该做什么预处理。要保存成什么文件,在ne本文版权归作者所有,未经授权不得转载。【本文受版权保护】w实例化的时候传入一个filename来著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。确定。上面有一个fallback,把st【版权所有】唐霜 www.tangshuang.net【本文受版权保护】yle-loader传给了它,这个动作的【转载请注明来源】转载请注明出处:www.tangshuang.net意思是,extract默认情况下先css【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net-loader再sass-loader编【原创内容,转载请注明出处】未经授权,禁止复制转载。译,如果一切顺利的话,结束之后把css导【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】出到规定的文件去。但是如果不顺利怎么办,【作者:唐霜】【版权所有】唐霜 www.tangshuang.net继续使用style-loader,把cs未经授权,禁止复制转载。未经授权,禁止复制转载。s混在js里面。
未经授权,禁止复制转载。原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。如果你的样式里面简单,没有设计其他问题,【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。我想上面这个配置就可以满足你了,但是如果【作者:唐霜】【版权所有】唐霜 www.tangshuang.net你的样式里面有使用图片、字体等资源,就麻【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】烦了。
【本文受版权保护】著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】切分大型css文件【版权所有,侵权必究】
【原创不易,请尊重版权】【作者:唐霜】原创内容,盗版必究。原创内容,盗版必究。和code splitting一样,当你【转载请注明来源】【未经授权禁止转载】的css文件超大时,也会导致下载要花很长【版权所有,侵权必究】【未经授权禁止转载】的时间。所以,切分这种超大型的css文件【本文受版权保护】本文作者:唐霜,转载请注明出处。也是有必要的。比如我们前面的例子,把bo本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】otstrap-sass编译出来,本身也著作权归作者所有,禁止商业用途转载。【转载请注明来源】就很大了,虽然下文我们会讲压缩优化之内的【本文受版权保护】【版权所有】唐霜 www.tangshuang.net,但是最后如果所有css都在一个文件,还转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net是比较恐怖。所以,我们还要想办法进行sp【转载请注明来源】【本文首发于唐霜的博客】lit。幸好,我又找到了一个插件来实现:
未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【转载请注明来源】【本文受版权保护】import CSSSplitWebpackPlugin from 'css-split-webpack-plugin'
{
plugins: [
new CSSSplitWebpackPlugin({
size: 4000,
filename: 'dist/css/[name]-part[part].css',
preserve: true,
}),
],
}
使用方法也很简单,而且可以和extrac未经授权,禁止复制转载。【作者:唐霜】t-text-webpack-plugi【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】n一起使用,sourcemap也会自己按本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】照切分进行切分。上面蓝色的配置项需要注意未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。一下,size: 4000不是说spli【版权所有】唐霜 www.tangshuang.net【转载请注明来源】t后的文件大小为4000,而是说一个pa【本文受版权保护】未经授权,禁止复制转载。rt的文件包含多少条css规则。file原创内容,盗版必究。【本文受版权保护】name里面不能使用[hash][chu未经授权,禁止复制转载。转载请注明出处:www.tangshuang.netnkhash]等,只有[name]和[p【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。art]两个可选项。preserve: 原创内容,盗版必究。本文作者:唐霜,转载请注明出处。true的意思是,保留原始文件,为fal【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。se的话,只有所有part文件,原始文件【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】和原始sourcemap会被删除。
著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】【作者:唐霜】【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。补充:有没有办法不打包vendors的s本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。tyle呢?比如说,我不想把vendor原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】s的scss打包到我的项目样式里面去,而【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。是单独引用vendors里面自己提供的c【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。ss。毕竟css和js是不一样的,css【原创不易,请尊重版权】原创内容,盗版必究。是一次性加载,不驻留内存的,所以通过把c未经授权,禁止复制转载。【版权所有,侵权必究】ss link标签移除可以实现移除样式的本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。目的,但是js不行,执行完之后就驻留内存本文版权归作者所有,未经授权不得转载。【转载请注明来源】,删除js引用没有半毛作用。那么实际上,【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net切分css反而变得简单了,它不存在相互之本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。间的引用问题,随便在样式里面的哪个地方,原创内容,盗版必究。转载请注明出处:www.tangshuang.net都可以断开来。
【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】但是,想要通过webpack把vendo【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。rs的scss单独打包却不是很容易。sc本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】ss有一个重要的机制,就是继承。倘若你要【原创不易,请尊重版权】原创内容,盗版必究。从某个vendor中继承某些特性,那么必本文版权归作者所有,未经授权不得转载。【本文受版权保护】须引用拥有该特性的文件,而且在sass编【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。译的时候,这个引用必须存在,而编译完之后【本文首发于唐霜的博客】未经授权,禁止复制转载。整个文件就已经出来了。所以,实际上,sa【作者:唐霜】著作权归作者所有,禁止商业用途转载。ss-loader调用node-sass未经授权,禁止复制转载。【本文首发于唐霜的博客】,node-sass调用libsass,【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】sass的编译过程跟webpack没有半著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】毛钱关系,所以你不可能写一个webpac【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netk插件来实现sass编译过程中的某些控制【本文受版权保护】【作者:唐霜】。所以,想要在编译的时候,保持这个@im【转载请注明来源】【原创内容,转载请注明出处】port的继承源,同时在编译结束的时候又转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net把两者分开,是比较困难的。
【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。【本文受版权保护】我今早写了一个原创内容,盗版必究。Note本文作者:唐霜,转载请注明出处。,就是讲解决这个问题的思路。简单的说就是【未经授权禁止转载】原创内容,盗版必究。,不能直接@import “【转载请注明来源】本文作者:唐霜,转载请注明出处。module”,而是应该im本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】port一个具体的入口scss文件,而这【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】个scss文件只提供变量、函数等的出口,转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。而不产生实际的css规则。这样,当你im转载请注明出处:www.tangshuang.net【未经授权禁止转载】port这个入口scss文件之后,虽然编转载请注明出处:www.tangshuang.net【转载请注明来源】译实际上还是会引用这个scss,但是编译【本文首发于唐霜的博客】【作者:唐霜】的结果中没有任何module的css输出本文作者:唐霜,转载请注明出处。【本文受版权保护】,因为你只是引入了当前你的项目文件中需要本文版权归作者所有,未经授权不得转载。【作者:唐霜】的一些scss全局变量之类的。
【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。分离font、image等assets【关注微信公众号:wwwtangshuangnet】
著作权归作者所有,禁止商业用途转载。【作者:唐霜】转载请注明出处:www.tangshuang.net原创内容,盗版必究。本文作者:唐霜,转载请注明出处。当你的样式里面有字体、图片等,就很复杂了本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】,特别是当这些图片、字体的引用路径跟你的【原创内容,转载请注明出处】【本文受版权保护】实际路径发生错位时,真是一点办法都没有。未经授权,禁止复制转载。【作者:唐霜】举一个例子:
转载请注明出处:www.tangshuang.net【转载请注明来源】转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【本文受版权保护】// style/index.scss
@import "libs/_fonts.scss";
@import "libs/_icons.scss";
// style/libs/_icons.scss...
.icon-tel {
background: url(../img/icons.png);
}
你可以发现这里引用了一张图片,而且它的路本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。径是相对于_icons.scss的,而非【原创内容,转载请注明出处】【版权所有,侵权必究】index.scss的,我们可以使用fi未经授权,禁止复制转载。【版权所有,侵权必究】le-loader来引用这个图片文件,但【作者:唐霜】著作权归作者所有,禁止商业用途转载。是问题是,路径问题怎么解决。这可能你还可未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。以通过自己在写代码的时候注意,但是一些第本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。三方的组件你怎么办?比如bootstra【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.netp-sass里面,有大量的字体文件引用,【原创内容,转载请注明出处】原创内容,盗版必究。而且它也是使用的相对路径,你真是没办法。
【本文受版权保护】【版权所有,侵权必究】【本文首发于唐霜的博客】【本文受版权保护】【本文首发于唐霜的博客】不幸中的万幸,有大神开发了一个resol【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。ve-url-loader解决了这个问题【作者:唐霜】本文作者:唐霜,转载请注明出处。。使用了这个loader,就可以实现无论本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net你的样式引用路径怎么变,都是基于你被引用【作者:唐霜】【版权所有】唐霜 www.tangshuang.net的那个文件来查找资源。这样就不会出现上面原创内容,盗版必究。原创内容,盗版必究。的路径问题了。不过,它的配置稍微有点复杂转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net。
原创内容,盗版必究。【本文受版权保护】未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】下面我们就结合file-loader和r【版权所有,侵权必究】未经授权,禁止复制转载。esolve-url-loader,实现【版权所有,侵权必究】【未经授权禁止转载】本节分离assets的目的:
【版权所有,侵权必究】【作者:唐霜】【转载请注明来源】import ExtractTextPlugin from 'extract-text-webpack-plugin'
export default {
entry: './app/index.js',
output: {
filename: 'dist/js/[name].[chunkhash:8].js',
libraryTarget: 'umd',
},
module: {
rules: [
{
test: /\.scss$/,
use: ExtractTextPlugin.extract({
use: [
{
loader: 'css-loader',
options: {
sourceMap: true,
},
},
{
loader: 'resolve-url-loader',
options: {
sourceMap: true,
keepQuery: true,
},
},
{
loader: 'sass-loader',
options: {
sourceMap: true,
importer: SassModuleImporter(),
},
},
],
fallback: 'style-loader',
}),
},
{
test: /\.woff2?$|\.(ttf|eot)$/,
loader: 'file-loader',
options: {
name: '[hash:16].[ext]',
outputPath: 'dist/font/',
publicPath: url => url.replace('dist/font/', '../font/'),
},
},
{
test: /\.(svg|png|jpg|jpeg|gif)$/,
loader: 'file-loader',
options: {
name: '[hash:16].[ext]',
outputPath: 'dist/img/',
publicPath: url => url.replace('dist/img/', '../img/'),
},
},
],
},
plugins: [
new ExtractTextPlugin({
filename: 'dist/css/[name].[chunkhash:8].css',
allChunks: true,
}),
],
}
上面的红色部分必须注意,其中source【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】Map必须true,它是resolver【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】-url-loader找到正确路径的依据【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。,如果不设置为true,就找不到正确的路原创内容,盗版必究。【未经授权禁止转载】径。而且是sass-loader一定要设本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】置。
本文版权归作者所有,未经授权不得转载。【转载请注明来源】【本文受版权保护】著作权归作者所有,禁止商业用途转载。file-loader的publicPa未经授权,禁止复制转载。【原创不易,请尊重版权】th配置项比较复杂。一般,我们会传一个字转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】符串给它,但是这里不能传字符串,因为有一【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】个路径问题,如果你传字符串,它会跟out【版权所有,侵权必究】【原创不易,请尊重版权】putPath组合起来,成为资源的url【转载请注明来源】未经授权,禁止复制转载。的前缀。而我们这里传入了一个函数,通过替转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】换的方式,把url前缀给处理掉了,这样,【关注微信公众号:wwwtangshuangnet】【转载请注明来源】css文件里面的各个资源url就可以正确【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】引用了。
本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【转载请注明来源】蓝色字所在的配置,让不同的资源放在不同的【版权所有,侵权必究】未经授权,禁止复制转载。文件夹下面,字体放font文件夹,图片放本文作者:唐霜,转载请注明出处。【转载请注明来源】img文件夹。
【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】优化压缩代码【访问 www.tangshuang.net 获取更多精彩内容】
【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net在产品上线的时候,我们会提前把代码优化压【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。缩后再上线。优化js,我们可以使用web本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。pack自带的UglifyJsPlugi转载请注明出处:www.tangshuang.net【本文受版权保护】n,这个比较好办:
原创内容,盗版必究。【转载请注明来源】【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。{
plugins: [
new webpack.optimize.UglifyJsPlugin({
minimize: true,
comments: false,
}),
]
}
优化提炼出来的css比较难办,因为css著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】是从脚本里面提炼出来的,很难进行处理。还本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。好,我们有插件可以帮忙,我们使用一个叫o【本文受版权保护】【版权所有】唐霜 www.tangshuang.netptimize-css-assets-w未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。ebpack-plugin的插件来处理:
著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。【未经授权禁止转载】import OptimizeCssAssetsPlugin from 'optimize-css-assets-webpack-plugin'
// ...
export default {
plugins: [
new OptimizeCssAssetsPlugin(),
]
}
optimize-css-assets-本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。webpack-plugin内部使用了c本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。ssnano来优化css,而cssnan转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。o内部又调用了postcss,所以如果你【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net对这两个工具比较熟的话,可以在后文的配置【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】的地方更清楚一点。
【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。本文作者:唐霜,转载请注明出处。总之,通过上面两步操作,js被优化了,而【版权所有,侵权必究】【转载请注明来源】且还享受了webpack的tree sh【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】aking功能,css也优化了,享受cs本文作者:唐霜,转载请注明出处。【转载请注明来源】snano带来的至极体验。
【本文首发于唐霜的博客】【转载请注明来源】【原创不易,请尊重版权】【作者:唐霜】【未经授权禁止转载】sourcemap问题著作权归作者所有,禁止商业用途转载。
【本文受版权保护】【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】原本,如果是产品上线的话,是不需要sou【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。rcemap的,但是如果你在本地先跑一下未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】看看,那么可以先把sourcemap加进【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。去,这样就可以在本地跑的时候,利用sou本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。rcemap进行调试了。
【未经授权禁止转载】【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net【本文受版权保护】【关注微信公众号:wwwtangshuangnet】启用sourcemap涉及的地方还挺多:
【原创不易,请尊重版权】【本文受版权保护】本文作者:唐霜,转载请注明出处。export default {
output: {
sourceMapFilename: '[file].map',
},
devtool: 'source-map',
plugins: [
new webpack.optimize.UglifyJsPlugin({
minimize: true,
comments: false,
sourceMap: true,
}),
new OptimizeCssAssetsPlugin({
cssProcessorOptions: {
map: {
inline: false,
},
discardComments: {
remove: comment => comment[0] !== '#',
},
},
}),
],
}
蓝色的[file]要注意,因为我们需要j【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】s和css的sourcemap分开,所以【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。,我们不能把sourcemapFilen本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。ame设置为[name].js.map,【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】这样的话你会发现,[name].js.m本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】ap最终其实是css的sourcemap【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】,js的sourcemap被这个文件覆盖【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】了。而使用[file].map的话,cs未经授权,禁止复制转载。原创内容,盗版必究。s的sourcemap会和css同一个目【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。录。
【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】下面两个插件配置中的红色部分也很重要,特原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。别是optimize-css-asset转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】s-webpack-plugin这个插件【作者:唐霜】转载请注明出处:www.tangshuang.net,它最终会调用postcss,而post【作者:唐霜】本文作者:唐霜,转载请注明出处。css对sourcemap又非常敏感,不【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net按照我红色标记的配置,会导致你的css中【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】丢失sourcemap的引用。
本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net原创内容,盗版必究。当然,实际上,当你进行产品发布的时候,s转载请注明出处:www.tangshuang.net【作者:唐霜】ourcemap是非必须的,甚至是不应该【未经授权禁止转载】【原创不易,请尊重版权】提供的,提供sourcemap反而会暴露【原创内容,转载请注明出处】【未经授权禁止转载】你的机器路径。
本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【本文受版权保护】小结著作权归作者所有,禁止商业用途转载。
未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】本文主要涉及的是webpack在应用层面【版权所有,侵权必究】【作者:唐霜】进行打包时的一些相对复杂的问题,而不是开本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】发过程中的问题,所以可能也比较偏门。但是【未经授权禁止转载】本文作者:唐霜,转载请注明出处。对于工具使用越熟悉,对我们的开发效率也越【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net有帮助。我把上面所讲到的所有点融合在一起【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。:
未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】/**
* webpack.config.babel.js
* this config file should be used to build production application
*/
import BowerResolvePlugin from 'bower-resolve-webpack-plugin'
import ExtractTextPlugin from 'extract-text-webpack-plugin'
import HtmlWebpackPlugin from 'html-webpack-plugin'
import shell from 'shelljs'
import path from 'path'
import webpack from 'webpack'
import OptimizeCssAssetsPlugin from 'optimize-css-assets-webpack-plugin'
import SassModuleImporter from 'sass-module-importer'
shell.exec('cd dist && rm -rf *') // 删除上一次打包结果
export default (env, defaults, options = {}) => { //导出函数形式,还可以直接在其他模块中引用
let config = {
entry: './app/index.js',
output: {
filename: 'dist/js/[name].[chunkhash:8].js',
libraryTarget: 'umd',
sourceMapFilename: '[file].map',
},
devtool: 'source-map',
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
loader: 'babel-loader',
options: {
presets: [['es2015', {modules: false}]],
},
},
{
test: /\.scss$/,
use: ExtractTextPlugin.extract({
use: [
{
loader: 'css-loader',
options: {
sourceMap: true,
},
},
{
loader: 'resolve-url-loader',
options: {
sourceMap: true,
keepQuery: true,
},
},
{
loader: 'sass-loader',
options: {
sourceMap: true,
importer: SassModuleImporter(),
},
},
],
fallback: 'style-loader',
}),
},
{
test: /\.woff2?$|\.(ttf|eot)$/,
loader: 'file-loader',
options: {
name: '[hash:16].[ext]',
outputPath: 'dist/font/',
publicPath: url => url.replace('dist/font/', '../font/'),
},
},
{
test: /\.(svg|png|jpg|jpeg|gif)$/,
loader: 'file-loader',
options: {
name: '[hash:16].[ext]',
outputPath: 'dist/img/',
publicPath: url => url.replace('dist/img/', '../img/'),
},
},
],
},
resolve: {
plugins: [
new BowerResolvePlugin(),
],
modules: [
'node_modules',
'bower_components',
],
descriptionFiles: [
'package.json',
'bower.json',
],
mainFields: [
'main',
'browser',
],
alias: {
_: 'underscore',
}, // 这是我项目中的一个处理,仅做参考
},
plugins: [
new webpack.ProvidePlugin({
jQuery: 'jquery', // for bootstrap-sass,这一点在前面没有讲到过,如果你用bootstrap-sass,需要注意这点
'window.jQuery': 'jquery', // for angular
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'vendors',
minChunks: (mod, count) => {
// this is used to pick out vendors
let resource = mod.resource
if(resource && (/^.*\.(css|scss)$/).test(resource)) {
return false
}
let context = mod.context
if(!context) return false
if(context.indexOf('node_modules') === -1 && context.indexOf('bower_components') === -1) return false
return true
},
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest', //But since there are no more common modules between them we end up with just the runtime code included in the manifest file
}),
new webpack.optimize.UglifyJsPlugin({
minimize: true,
comments: false,
sourceMap: true,
}),
new ExtractTextPlugin({
filename: 'dist/css/[name].[chunkhash:8].css',
allChunks: true,
}),
new OptimizeCssAssetsPlugin({
cssProcessorOptions: {
map: {
inline: false,
},
discardComments: {
remove: comment => comment[0] !== '#',
},
},
}),
new HtmlWebpackPlugin({
filename: 'dist/index.html',
template: 'app/index.html',
chunksSortMode: (chunk1, chunk2) => {
let orders = ['manifest', 'vendors', 'main']
let order1 = orders.indexOf(chunk1.names[0])
let order2 = orders.indexOf(chunk2.names[0])
return order1 > order2 ? 1 : order1 < order2 ? -1 : 0
},
}),
],
}
return config
}
这就是我写的一个demo,把前文所述的所【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】有知识点集中在了一起。你可以根据自己的项转载请注明出处:www.tangshuang.net【作者:唐霜】目实际情况来选择使用其中的某个点。
【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。
当然,我的表述也可能存在胡扯的地方,你【本文受版权保护】转载请注明出处:www.tangshuang.net要是发现了,就在下面留言吧!


