vue 开发常用工具及配置六:认识各种 loader

  • 2020 年 1 月 14 日
  • 笔记

本文大约 2400 字。

目录

  • Webpack 的工作原理
  • loader 和 plugin 的区别
  • webpack 如何处理 css 文件
  • 三种样式 sass/scss 和 less 的区别
  • 另一种定义全局 less 变量的方法
  • 源码

Webpack 的工作原理

默认 webpack 只能处理 js 文件,如果在 js 文件中导入了 css 代码:

import './css/style.css';

程序将会报错:

You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file.

这与其工作原理有关。webpack 的工作原理是,从配置文件定义的模块列表开始,依赖文件类型选择使用不同的 loader分别进行处理,最后将所有模块打包为bundle,这个 bundle 可由浏览器加载。

Webpack 用于完成打包任务的模块,主要有 loader 与 plugin。有一个类型就有一个 loader,如果 loader 缺失,程序就会报错了。

loader 和 plugin 的区别

loader

用于对模块源码的转换,loader 描述了 webpack 如何处理非 js 模块,并且在 build 过程中引入这些依赖。loader 可以将文件从不同的语言转换为 js,或者将内联图片转换为 data URL。例如sass-loader,css-loader,style-loader等都是 loader。

在 webpack.config.js 中配置 loader 及 module.rules 可以指定多个 loader。

plugin

plugin 存在的目的在于解决 loader 无法实现的其他事,从打包优化和压缩,到重新定义环境变量,可以用来处理各种各样的任务。例如,CommonChunkPlugin 主要用于提取第三方库和公共模块,避免 bundle 体积过大。

webpack 如何处理 css 文件

webpack 中默认只能打包 .js 类型的文件,无法打包其他类型文件。如果要打包非.js类型文件,需要手动安装一些第三方 loader。下面看一下 webpack 在这方面是如何处理的。

在项目中用 npm 命令本地安装 style-loader 和 css-loader 两个包:

npm install style-loader css-loader --save--dev

在引用 style.css 文件时,将 import './css/style.css' 代码修改为:

import 'style-loader!css-loader!./style.css'")';

先经过 css-loader 和 style-loader 的处理,这样css代码就能正常工作了。

这种方式每次引入时都需要加上“style-loader!css-loader!”,比较麻烦。除了这种方法,还可以在工程文件中一次性配置loader,研发中通常采用的是这种方式。

如果是 webpack 工程,打开webpack.config.js文件,在里面新增一个配置节点module,在module对象中,有一个rules属性,它是一个数组,里面存放了所有第三方文件匹配和处理规则。如下代码匹配处理css文件:

module: { // 配置所有第三方loader 模块      rules: [ // 第三方模块的匹配规则        { test: /.css$/, use: ['style-loader', 'css-loader'] }, // 处理 CSS 文件的 loader      ]    }

注意:此处'style-loader'和'css-loader'顺序不可替换。因为use中处理顺序为从右向左。先用css-loader对css文件进行处理,将处理后的结果交给style-loader作进一步处理。其中,css-loader用于加载、解析css代码;style-loader生成一个内容为最终解析完的css代码的style标签,放在html页面的head内。

对于 vue cli3 创建的项目,在vue.config.js/configureWebpack内,添加如下配置:

config.module.rules.push({ test: /.css$/, use: ['style-loader', 'css-loader'] })

使用 less

首先是安装插件:

yarn add style-loader css-loader less-loader less

然后修改 vue.config.js 配置:

// use less  config.module.rules.push({ test: /.less$/, use: ['style-loader', 'css-loader', 'less-loader'] } )

因为调用顺序是从右向左,所以先使用 less-loader 处理 less 代码,使之成为标准的css 代码,接下来的处理方式就和加载普通的css文件一致了。

这个显式配置与默认配置有差异,导致编译不通过。可以使用如下命令:

vue inspect -v --mode development > config-output.txt

查看默认配置。在 config-output.txt 文本中查看有关 less 的内容,与上面的配置内容有显著差异。

使用 scss

使用scss与使用less类似。

先是安装插件:

yarn add style-loader css-loader sass-loader node-sass

再是配置:

config.module.rules.push({ test: /.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }  )

因为项目中使用了 vuetify,在这个项目中混用scss会有编译错误。可以采用同样的方法,使用 vue inspect 指令导出默认配置查看差异所在。

三种样式 sass/scss 和 less 的区别

Sass

Sass (Syntactically Awesome Stylesheets)是一种动态样式语言,Sass语法属于缩排语法,比css比多出好些功能(如变量、嵌套、运算,混入(Mixin)、继承、颜色处理,函数等),更容易阅读。

Scss

Sass的缩排语法,对于写惯css前端的web开发者来说很不直观,也不能将css代码加入到Sass里面,因此sass语法进行了改良,Sass 3就变成了Scss(sassy css)。与原来的语法兼容,只是用{}取代了原来的缩进。

less

Less也是一种动态样式语言. 对CSS赋予了动态语言的特性,如变量,继承,运算, 函数. Less 既可以在客户端上运行,也可在服务端运行。

1)编译环境不一样

Sass的安装需要Ruby环境,是在服务端处理的,而Less是需要引入less.js来处理Less代码输出css到浏览器,也可以在开发环节使用Less,然后编译成css文件。

2)变量符不一样

Less是@,而Scss是$,而且变量的作用域也不一样。

3)Less没有输出设置

Sass提供4种输出选项。

Sass提供4种输出样式,默认为nested

  • nested:嵌套缩进的css代码
  • expanded:展开的多行css代码
  • compact:简洁格式的css代码
  • compressed:压缩后的css代码

4)Sass支持条件语句

Sass 可以使用if{}else{},for{}循环等等。而Less不支持。

结论:Sass 功能虽比 Less 强大,但 Less 相对清晰明了,易于上手,对环境要求宽松。快速开发使用 less 足够。

另一种定义全局 less 变量的方法

使用 less 不同避免地涉及多个样式文件中的变量共享。在前面一篇文章“vue 开发常用工具及配置三”中,曾使用如下配置完成全局less变量的共享:

pluginOptions: {   'style-resources-loader': {     preProcessor: 'less',     patterns: [       path.resolve(__dirname, './src/assets/styles/variable.less'),     ],   },  },

这是一种使用 plugin 的解决方式,在vue.config.js使用 pluginOptions 通过配置达成。除了这种方法,还可以直接在vue.config.js/css.loaderOptions.less节点下,直接声明全局变量:

loaderOptions: {    // 给 less-loader 传递 Less.js 相关选项    less:{      // http://lesscss.org/usage/#less-options-strict-units `Global Variables`      // `primary` is global variables fields name      globalVars: {        primaryBgColor: '#fff'      }    }  }

在vue组件中这样使用:

<style lang="less" scoped>  button{   color: @theme-color;   background-color: @primaryBgColor;  }  </style>

源码

https://git.code.tencent.com/shiqiaomarong/vue-go-rapiddev-example/tags/v202001022

参考链接

https://github.com/webpack-contrib/sass-loader

https://www.cnblogs.com/tangjiao/p/10429645.html

webpack的loader和plugin的区别

Vue – Mixing SASS with SCSS, with Vuetify as an Example

Vue – Mixing SASS with SCSS, with Vuetify as an Example

https://juejin.im/post/5d6ba287e51d453b5e465b80

Webpack中loader打包各种文件

https://www.cnblogs.com/wangpenghui522/p/5467560.html

[专栏]基于 vue+go 如何快速进行业务迭代?