第一种情况
src/ 文件夹中没有需要的图片文件,所有图片都是直接放在了 dist/ 文件,这样的情况下,比如 main.scss 中:
这里直接运行 webpack,就会报错:
发生了什么?
基本就是我们告诉 webpack,去编译 main.scss,webpack 就去编译了,但当处理到 background 属性的时候,我们给的值是一个 url,因为我们想引用一张 image 作为 background-image,但是 webpack 按照我们给予的 url 去找,结果没有找到。
怎么解决?
方案一
比如说这是一个 legacy project,文件的链接已经固定了,那么最简单的办法就是,使用绝对路径(absolute path),css-loader 就会彻底忽略这条链接。
方案二
如果这是一个非常大的项目,那么可能就会有很多很多文件路径,要把所有相对链接修改成绝对链接会非常麻烦,这个时候就需要修改 webpack.config.js 配置文件,告诉 css-loader 不要去试图编译任何 url。 css loader 文档中相关选项:链接。原来 .scss 规则就需要作出对应修改:
{ option: { url: false } } 会做一定的转换,或者说 fallback,比如如果有这样一个属性定义: background-image: ./images/test.png,通过 url: false 转换的结果就是:background-image: images/test.png,在这里 ./ 就被自动过滤了。不确定有没别的自动 fallback 转换,暂时只观察到这一个。
方案三
使用 raw-loader,raw-loader 顾名思义,就是告诉 webpack,css 我需要的是怎么样的,我已经写成了什么样,不要对它做任何操作。使用 raw-loader 的时候 webpack 就把导入进来的 css 当做了字符串,任何编译都不会执行。
第二种情况
以上是 images 文件已经在 dist/ 文件夹的情况,基本也就是在处理一个 legacy project 的时候遇到的比较多。但是,what if 开始搞一个新的项目的时候,images 本来就是在 src 文件夹中的呢?
这时候就需要对文件做处理,需要使用到 file-loader 来对 image 文件来操作,如下的文件结构中:
在 webpack.config.js 添加相关配置:
这里做了什么?
- 检查是否是 .png文件;
- 是的话使用 file-loader来进行处理;
- 将 .png重命名为[name].png的格式,并且存放到dist/下的images/目录。
技术发展迭代很快,所以这些笔记内容也有类似新闻的时效性,不免有过时、或者错误的地方,欢迎指正 ^_^。
BEST
Lien(A.K.A 胡椒)