写在前面
webpack 的 loader 和 plugin 太多了,在项目开发过程中可以根据功能需要去 webpack 官网搜索配置。
这里只介绍自己目前用到的,以后会继续补充。
1. 引入 scss
scss 是 sass 语言的另个语法,详细可见 Sass简介
引入 scss 的方法详细见官网 sass-loader 或 github
sass-loader 的内部实现肯定依赖 sass ,所以安装 sass-loader 的同时也要安装 sass
安装 sass 和 sass-loader
yarn add sass-loader sass --dev // 使用默认配置就行,当前默认配置就是 dart-sassyarn add sass-loader dart-sass --dev // 使用 dart-sass 时要有一些配置yarn add sass-loader node-sass --dev //不推荐使用 node-sass,会有一些问题
使用 sass 的配置信息:
module.exports = {module: {rules: [{test: /\.s[ac]ss$/i,use: ['style-loader','css-loader','sass-loader',],},],},};
使用 dart-sass 的配置信息,node-sass 同理
module: {rules: [{test: /\.s[ac]ss$/i,use: ['style-loader','css-loader',{loader: 'sass-loader',options: {implementation: require('dart-sass'),},},],},],
2. 引入 less
less-loader 的内部实现肯定依赖 less ,所以安装 less-loader 的同时也要安装 less
安装 less 和 less-loader
yarn add less less-loader --dev
配置信息
module: {rules: [{test: /\.less$/,loader: ['style-loader', 'css-loader', 'less-loader'],}],}
3. 引入 stylus
安装 stylus 和 stylus-loader
yarn add stylus stylus-loader --dev
配置信息
module: {rules: [{test: /\.styl$/,loader: ['style-loader', 'css-loader', 'stylus-loader'],}],}
通过上述三种 css 语言的变种的引入可以看出,都是需要先将其转化为 css,再由 css 转化为 <style> 或抽离成 css 文件。
4. 引入图片
由于我们使用 webpack 开发项目时,代码编辑目录和运行代码目录是两个完全独立的文件夹,因此,在使用图片资源时,不能直接使用相对路径,会出错。需要对图片进行转化,得到其在打包后的真正相对路径和带有 hash 的文件名。
file-loader 的作用就是将文件变成文件路径。
安装 file-loader
yarn add file-loader --dev
配置信息
module: {rules: [{test: /\.(png|jpe?g|gif)$/i,use: ['file-loader'],},]}
引入 svg
svg 图片与 jep/png 等普通的图片资源存在一定的差别。当你下载一个 svg 图片在编辑器中打开看的时候会发现其是一段 xml 语言的代码。并且 svg 图片是矢量图,怎么放大都不会失真。jep/png等是位图,放大会失真。
因此 svg 图片在前端工程中有着不同于普通图片的使用方式。
直接使用 svg 代码
在工程中直接使用 svg 标签嵌入 svg 图片。
<svg version="1.1"baseProfile="full"width="300" height="200"xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="red" /><circle cx="150" cy="100" r="80" fill="green" /><text x="150" y="125" font-size="60" text-anchor="middle" fill="white">SVG</text></svg>
把 svg 当普通图片使用
使用 file-loader 或者 url-loader 加载 svg 图片,将 svg 图片当作普通图片使用 img 标签使用。
制作 svg 雪碧图
还有一种使用 svg 图片的方法是使用 svg + use 的方式,像 iconfont 里使用 svg 图标的方式一样。示例如下:
<svg class="icon" aria-hidden="true"><use xlink:href="#icon-xxx"></use></svg>
这种使用方式的原理是将全部的 svg 图片放到一个 svg 中,以 symbol 标签的方式进行定位,在使用的时候直接传递 symbol 标签对应的 id 名字即可渲染对应的图标。
这种方式用到的相关 loader 为 svg-sprite-loader 和 svgo-loader。
webpack 的配置如下:
module: {rules: [{test: /\.svg$/,use: [{loader: "svg-sprite-loader",options: {symbolId: "icon-[name]" // 指定 symbol 的 id,在使用时的名字}}]}]}
使用 svg-sprite-loader 后我们再 import svg 图片的时候,就不再像 file-loader 一样是一个图片路径了,而是一个 BrowserSpriteSymbol 对象。
通常情况下,我们下载下来的 svg 图片自带颜色,外部无法再给其指定颜色,这是因为其 svg 标签里的 path 带有 fill 属性,写死了颜色。如果我们想通过外部改变 svg 图片的颜色,需要将 fill 字段去掉后使用 css 的 fill 属性设置颜色。
svgo-loader 可以对 svg 图片的源代码进行处理,比如删除不必要的属性,优化其大小。因此可以用 svgo-loader 来对 svg 图片统一去除 fill 属性进行去色处理。
svgo-loader 使用 svgo 工具处理 svg 图片。
module: {rules: [{test: /\.svg$/,use: [{loader: "svg-sprite-loader",options: {symbolId: "icon-[name]"}},{loader: "svgo-loader",options: {plugins: [{name: "removeAttrs",params: {attrs: "fill"}}]}}]}]}
这样一来,所有引入的 svg 就没有颜色了,通过添加类名,使用 css 的 fill 属性指定颜色。如下:
<svg class="icon"><use xlink:href="#icon-test"></use></svg><style>.icon {width: 2em;height: 2em;fill: red;}</style>
如果想更进一步封装组件和批量加载,详见 封装 svg-icon 组件
6. webpack 懒加载
在 webpack 中,模块的导入导出使用的是 import 和 export。但是如果将所有的模块在一开始就全都 import 进来,会大大降级页面的加载速度。因此懒加载就是在模块需要的时候才加载出来,使用的是 import()函数。
import() 函数接收一个加载模块的路径,返回一个 Promise 对象。
lazy.js
export default function () {console.log('我是懒加载')}
index.js
button.onclick = ()=>{import('./lazy.js').then((module)=>{module.default()})}
