gpt4 book ai didi

node.js - 来自网络的文件的 node-sass 自定义导入器不起作用

转载 作者:行者123 更新时间:2023-12-03 12:15:06 26 4
gpt4 key购买 nike

我正在尝试将样式表从 Google 字体导入样式表,以避免稍后出现 eytra 请求。
我的 main.scss文件以

@import "https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;1,400;1,700;1,900&family=Source+Code+Pro:wght@400;700&display=swap";
我希望得到 main.css开始
@font-face {
font-family: 'Lato';
font-style: italic;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/lato/v17/S6u8w4BMUTPHjxswWw.ttf) format('truetype');
}
/* etc */
为此,我有以下脚本:
var scss = require("node-sass");
var https = require('https');

function compile(filePath, dirs, callback){
scss.render({
file: filePath,
includePaths: dirs,
outputStyle: 'expanded',
sourceMap: false,
importer: [
function(url, prev, done) {
if (url.startsWith('https')) {
https.get(url, (res) => {
let contents = '';
res.on('data', (d) => contents += d);
res.on('end', () => {
console.log('scss')
done({contents})
});
});
}
return null;
}
]
}, function (e, css) {
if (error) {
return callback(error)
}
callback(null, css.css)
});
}

compile('main.scss', null, (e, d)=>{console.log(d.toString())})
node-sass spec说内容应该作为

An object with the key contents whose value is the contents of a stylesheet (in SCSS syntax). This causes Sass to load that stylesheet’s contents.


我可以看到导入器函数被调用,解析了请求并且在 contents 中有想要的样式表文本。多变的。输出被写入控制台,但仍然有原始的 @import线。
这哪里出错了?
编辑:如果使用 node-sass, Node 会崩溃并显示消息 Speicherzugriffsfehler .将使用的库更改为 sass 后,崩溃不会发生,但未解决导入的错误仍然存​​在。
同样,尝试使用虚拟静态规则 .bla {--blubb: green;}因为返回的内容不起作用。

最佳答案

在仔细检查了 dart-sass 库后,我找到了一个解决方案。似乎以 http(s):// 开头的 URL协议(protocol)永远不会传递给导入器函数。
所以你必须稍微欺骗一下,这不是一个通用的解决方案。
main.scss文件,缩短协议(protocol)的 URL:

@import "fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;1,400;1,700;1,900&family=Source+Code+Pro:wght@400;700&display=swap";
然后,捕获 fonts在导入器函数的开头:
    importer: function(url, prev, done) {
if (url.startsWith('fonts')) {
https.get('https://' + url, (res) => {
let contents = '';
res.on('data', (d) => contents += d);
res.on('end', () => done({contents}));
});
}
},
注意一个重要的区别:没有 return null;if 之后条款。这导致导入器结果被传递,尽管它正确加载了文件内容。
整个解决方案仅适用于 (dart-)sass ,而不是 node-sass,由于某种原因,它以无限循环结束。

关于node.js - 来自网络的文件的 node-sass 自定义导入器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65012026/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com