【发布时间】:2017-01-17 03:49:55
【问题描述】:
我有以下 Webpack 配置(大致上,它已经为这篇文章进行了简化):
const rootPublic = path.resolve('./public');
const LOCAL_IDENT_NAME = 'localIdentName=[name]_[local]_[hash:base64:5]';
const CSS_LOADER = `css?sourceMap&${LOCAL_IDENT_NAME}&root=${rootPublic}`;
const SASS_LOADER = 'sass?sourceMap&includePaths[]=' + path.resolve(__dirname, './src/styles');
// ... loaders:
loaders: [
{
test: /\.(jpe?g|png|gif|svg)$/,
loader: 'url-loader?limit=10000&name=[path][name].[ext]'
},
{
test: /\.scss$/,
loader: config.DEVELOPMENT_MODE ? `style!${CSS_LOADER}!autoprefixer!${SASS_LOADER}`
: ExtractTextPlugin.extract('style', `${CSS_LOADER}!autoprefixer!${SASS_LOADER}`)
}, // ...
]
现在这对于在 scss 文件中通常引用的图像非常有效:
.some-static-class {
background: url('/images/bg.png');
}
但是,当使用:local 指令时,它确实不起作用:
:local .SomeClass {
background: url('/images/bg.png');
}
我认为这是因为 root 是为 CSS 加载器定义的。我收到构建错误:Module not found: Error: Cannot resolve 'file' or 'directory' ./../../../../../../../../images/bg.gif
如果我改为从 css-loader 配置中删除 root,那么它构建得很好,但是在 Chrome 的检查器中路径“看起来”是正确的,但是当你实际在新选项卡中打开链接时,它指向:@ 987654329@ 显然无法正确解析。
我不确定问题出在url-loader 配置上,还是到底发生了什么。
我尝试了不同的 webpack 配置来指定 resolve.root、resolve.modulesDirectories 等,但完全不确定它们是否有任何影响,或者我是否完全错误。我也遇到了resolve-url-loader,但不确定这是否是我所需要的。
有什么想法吗? MTIA!
更新
我应该注意,它在 Safari 中可以正常工作,但在 Chrome 中却不行。因此,这似乎是 Chrome 特有的错误,但必须在 Safari 中完成所有开发是不切实际的。
我还遇到了vue-style-loader,它是样式加载器的一个分支,声称可以解决这个问题,但它修复它的方式是依赖于一个不推荐使用的骇人听闻的转义/取消转义方法。
【问题讨论】:
标签: webpack webpack-dev-server urlloader webpack-style-loader