目前正在完善 4 个相同站点的共享 webpack 构建,其中样式仅因 SASS 中特定于站点的变量覆盖而有所不同,并且正在寻找一种方法来在运行或运行 SASS 编译器之前动态替换SASS文件@import顶部的引用。sass-loadercss-loader
例如,类似的组件text-input.scss可能具有以下结构:
@import '../../styles/global/_variables.scss';
@import '../../styles/<<<SITENAME>>>/_variables.scss';
.some-class {
...
}
Run Code Online (Sandbox Code Playgroud)
我想要一种在 SASS/SCSS 编译器启动之前用在构建时传入的变量替换<<<SITENAME>>>字符串的方法。env.sitename
例子:
webpack env.sitename=site1 --progress --config ./wp.config.js
Run Code Online (Sandbox Code Playgroud)
结果是,在运行时sass-loader,字符串替换的文件在 SASS 编译器中看起来如下:
@import '../../styles/global/_variables.scss';
@import '../../styles/site1/_variables.scss';
.some-class {
...
}
Run Code Online (Sandbox Code Playgroud)
我尝试过,string-replace-loader但无法在 SASS 编译器尝试解析所有文件名之前让它运行并执行替换,考虑到 webpack 模块解析的工作方式,这是有意义的。
有没有插件或加载器可以从 webpack 中解决这个问题?
谢谢
我最终找到了处理这个问题的“webpack方式”——创建一个别名。
使用上面的示例,执行上面的命令:
webpack env.sitename=site1 --progress --config ./wp.config.js
Run Code Online (Sandbox Code Playgroud)
siteStyles我在 webpack 配置中创建了一个别名:
{
...
resolve: {
alias: {
...
siteStyles: path.join(ROOT_DIR, `path/to/${env.sitename}/scss`)
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
* 注:ROOT_DIR是代表项目根的变量
有了方便的别名,我们现在可以~在 SCSS/SASS 文件中使用波形符 ( ) 来利用 SCSS/SASS 的路径解析功能,如下所示:
@import ~siteStyles/component/foo;
并且导入将解析到目录foo.scss中ROOT_DIR/path/to/site1/scss/component。
通过结合 webpack 别名、~SASS/SCSS 功能和绝对文件系统路径,我能够在构建过程中解析正确的特定于站点的样式。
| 归档时间: |
|
| 查看次数: |
1702 次 |
| 最近记录: |