VUE项目中CSS管理
在vue项目中,当 .vue文件中 <style>
标签有 *scoped 属性时,它的 CSS 只作用于当前组件中的元素,很好的实现了样式私有化的目的。
使用scoped之后,父组件的样式将不会渗透到子组件中。不过一个子组件的根节点会同时受其父组件有作用域的 CSS 和子组件有作用域的 CSS 的影响,如果希望父组件样式影响子组件,可以使用 >>>
操作符:
1 2 3 | <style scoped> .a >>> .b { /* ... */ } </style> |
sass变量和mixin
一般情况scss中的变量和mixin的作用域仅限于当前文件,每次在vue文件中引用公共变量或者mixin的时候,都需要先将mixin.scss
import进来。当我们有很多个vue组件的时候,这是一件非常非常麻烦的事情。
这个时候我们就需要用到sass-resources-loader
了,它会在webpack打包过程中帮助我们将全局scss文件import到每个Vue组件中,举个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | module: { rules: { test: /\.vue$/, loader: 'vue-loader', options: { loaders: { css: 'vue-style-loader!css-loader', scss: [ 'vue-style-loader', 'css-loader', 'sass-loader', { loader: 'sass-resources-loader', options: { resources: path.resolve(__dirname, './src/modules/scss/mixin.scss') } } ] } } } } |
如果我们需要在其它scss文件中使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | module: { rules: [{ test: /\.scss$/, use: [ 'style-loader', 'css-loader', 'sass-loader', { loader: 'sass-resources-loader', options: { resources: path.resolve(__dirname, './src/modules/scss/mixin.scss') } } ] }] } |
需要注意的是,
sass-resources-loader
会将common.scss
注入每个vue组件中。为避免重复打包,不要在common.scss
写具体的CSS方法。
webpack打包优化
如果希望将项目中css抽离出来单独打包缓存,需要用到webpack的插件extract-text-webpack-plugin
,下面是官方vue-loader文档中的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | // webpack.config.js var ExtractTextPlugin = require("extract-text-webpack-plugin") module.exports = { // other options... module: { rules: [ { test: /\.vue$/, loader: 'vue-loader', options: { loaders: { css: ExtractTextPlugin.extract({ use: 'css-loader', fallback: 'vue-style-loader' // <- 这是vue-loader的依赖,所以如果使用npm3,则不需要显式安装 }) } } } ] }, plugins: [ new ExtractTextPlugin("style.css") ] } |
这样就可以将vue组件里面的css单独打包出来。
如果是移动端的项目,可以选择使用html-webpack-inline-source-plugin
把CSS内联到html里面以减少请求。