咱们不少时候写了一个公共的common.scss,而后在各个vue里面css
<style scoped> import '@/assets/css/common.scss' </style>
因为加了scoped,致使common里面的样式都加上了[data-v-aaaa]
这样的标识,最后打出来的css重复,这就不是公共css了。html
而且在多少个vue里面import就会打包多少次common.scss进去,最后致使css打出来很大。vue
下面的代码打包出来只会有一份global.scss,也就是不会重复打包。因此为了方便,直接在main.js引入一次就够了webpack
//a.vue <style > @import '@/assets/css/global.scss' </style>
//b.vue <style > @import '@/assets/css/global.scss' </style>
为了避免重复打包,那我把公共的css代码拿出来不放在scoped里面不就行了。git
//global.scss .white{ color:#fff}
//a.vue <style > @import '@/assets/css/global.scss' </style>
可是下面这个状况不行,运行会报错:$white is not defined
github
// variable.scss $white:#fff;
//a.vue <style > @import '@/assets/css/variable.scss' </style> <style scoped> .white{ color:$white; } <style/>
而后试了一下web
<style scoped> @import '@/assets/css/variable.scss' .white{ color:$white; } </style>
发现打出来的css里面变量$white直接编译成#fff了,打包后的css里面找不到$white,因此就不用担忧会重复打包这些变量了。浏览器
以前控制台中心在IE9浏览器下样式混乱。说是IE浏览器对css有些约束ui
Stylesheet Limits in Internet Explorer.net
而后用了下面两个插件解决。好像也能够设置splitChunk解决,不过试了效果不太满意,后面再继续探究。
optimization: { minimizer: [ new CSSSplitWebpackPlugin({ size: 4000, filename: path.posix.join(assetsDir,'css/[name]-[part].[ext]'), }), new OptimizeCSSAssetsPlugin({ assetNameRegExp: /\.css$/g, cssProcessor: require('cssnano'), cssProcessorOptions: { discardComments: {removeAll: true },reduceIdents:false }, canPrint: true }), ] },
<style scoped>
里@import使用//main.js import '@/views/order/style.scss';
//@/views/order/style.scss .order{ xxxxx }
最后把代码按照上面的方法整理了一下,结果打包出来的css足足小了127kb
------------------2019/2/19更新------------------
注意:以前在想,既然<style></style>
(不用scoped)放在哪里均可以全局生效,那我随便放在一个大组件里也行啊。
最近发如今一个组件里面不用scoped地引入css,从这个组件进去另外一个组件,另外一个组件确实是会受到前者css的影响。
可是若是直接打开后者组件的页面,不通过前者,css无效。因此全局css仍是放在main里面好。
------------------2019/2/27更新------------------
关于上面 webpack打包后体积依然过大的css文件的问题我发现还有一种解决方法:使用懒加载,使用方法以下:
Lazy Loading in Vue using Webpack's Code Splitting
懒加载会把每一个vue组件变成一个chunk,天然对应css也会变成一个chunk。感受这个方法比较不错
有一个地方比较特殊:组件上要用ref引用的话,这个组件不可使用懒加载https://lry1994.github.io/stu...。
对于其余库文件的话,能够设置splitchunk.maxSize进行切割