您可以尝试将这两个库与 webpack 一起使用,先转换为 cssobj,然后再转换为纯 CSS。
https://github.com/cssobj/cssobj-converter(支持 sass/less)
var converter = require('cssobj-converter')
var obj = converter('p { color: red; }') //obj is a css object
https://github.com/cssobj/cssobj
var cssobj = require('cssobj')
var result = cssobj(obj) // the result is a CSS string
您可以编写一个全局唯一的函数 __insertCSS(在您应用的 index.js 中),它在 head 元素中插入 plain CSS 字符串。
现在这些库只能在节点上运行,所以你还需要一个步骤才能让它在浏览器中运行:一个字符串替换插件
https://www.npmjs.com/package/string-replace-webpack-plugin
在 webpack 配置中,您应该配置替换插件以搜索类似 /__insertCSS\(.*?\)/ 的模式,获取字符串参数,如上所示处理它并用结果替换它。
在你的 webpack 配置中:
var StringReplacePlugin = require("string-replace-webpack-plugin");
var converter = require('cssobj-converter')
var cssobj = require('cssobj')
function parseSass(str){
var obj = converter(str) //obj is a css object
return cssobj(obj) // the result is a CSS string
}
...在module:
loaders: [
// configure replacements for file patterns
{
test: /\.js(x?)$/,
loader: StringReplacePlugin.replace({
replacements: [
{
pattern: /__insertCSS\(`(.*?)`\)/ig,
replacement: function (match, p1, offset, string) {
//p1 is the string enclosed by backticks
var cssStr = parseSass(p1);
//need to escape quotes with JSON in resulting string
return '__insertCSS("' + JSON.stringify(cssStr) + '")'
}
}
]})
}
]
请注意,我还没有测试过,但乍一看似乎可行。
这个字符串替换加载器必须在 babel 之前,把它放在loaders 数组的最前面
文档在这里:https://webpack.github.io/docs/loaders.html#loader-order