我有一个npm包,其结构如下:
--src
--styles
-image.png
-style.scss
style.scss
文件像这样引用图片:
.test {
background-image: url(./image.png);
}
问题在于当我使用这个包的时候,CSS文件查找图片是从根目录开始而不是相对于我的包来查找,我们如何解决这个问题?
这是我导入该包的方式:
@import "mypackage/src/styles/style";
我有一个npm包,其结构如下:
--src
--styles
-image.png
-style.scss
style.scss
文件像这样引用图片:
.test {
background-image: url(./image.png);
}
@import "mypackage/src/styles/style";
最近我遇到了这个问题,而StackOverflow上的信息已经过时了(正如预期的那样,这是一个与NPM和Web开发相关的问题,在这个领域一切都在快速发展)。
从根本上讲,这个问题完全可以通过Webpack 5来解决,因为它自带了解决方案。只需要更新webpack.config.js
文件即可。
关于这个问题,Webpack文档中的部分内容在这里:https://webpack.js.org/guides/asset-modules/
你需要做的就是将静态资源进行Base64编码并将其嵌入到CSS/JavaScript中。
实际上,在你整理源代码以在NPM上发布时,如果你有一些CSS文件引用了静态图片,比如:background-image: url(./image.png)
,你需要将你的资源嵌入到样式文件中,然后使用 style-loader
和 css-loader
库来处理你的样式文件。
webpack.config.js
中解决了我的问题,并允许我导出一个单独的index.js
文件与我的包一起使用,我可以将其导入到其他项目中。type: asset/inline
行。webpack.config.js
...
...
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: ["babel-loader"],
},
{
test: /\.css$/i,
use: ["style-loader", "css-loader"],
},
{
test: /\.(png|jpg|gif)$/i,
type: "asset/inline",
},
],
},
...
...
你只需要像这样安装文件加载器。
npm install file-loader --save-dev
然后将此行添加到配置文件中的模块部分:
module: {
rules: [{
test: /\.(png|svg|jpg|gif)$/,
use: ['file-loader']
}]
}
styles
,那么只提到image.png
) - Mr_Green