You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome扩展中从content.js加载内嵌字体失败的原因及解决方法

问题原因

Chrome扩展的__MSG_@@extension_id__占位符仅会被Chrome在它直接加载的资源文件中自动替换(比如manifest里声明的content_scripts中的CSS文件)。但Webpack打包后的content.js属于JS执行代码,Chrome不会主动扫描并替换JS字符串里的占位符,导致路径中的占位符未被解析,最终变成无效的chrome-extension://invalid/地址。

解决方案

方法1:在content.js中直接使用chrome.runtime.id拼接路径

content script属于扩展上下文,可直接调用chrome.runtime.id获取扩展ID,手动拼接字体路径:

// 示例:动态创建@font-face样式并注入
const fontFaceStyle = document.createElement('style');
fontFaceStyle.textContent = `
@font-face {
    font-family: 'Nunito';
    font-style: normal;
    font-weight: 500;
    src: url('chrome-extension://${chrome.runtime.id}/fonts/Nunito-Medium.ttf');
}
`;
document.head.appendChild(fontFaceStyle);

如果是Webpack打包生成的CSS代码里的路径,也可以在JS中替换占位符:

// 假设Webpack打包后的CSS内容存在cssContent变量中
const resolvedCss = cssContent.replace('__MSG_@@extension_id__', chrome.runtime.id);
// 注入处理后的CSS
const styleEl = document.createElement('style');
styleEl.textContent = resolvedCss;
document.head.appendChild(styleEl);

方法2:将字体相关CSS单独作为资源由Chrome加载

把需要使用字体的CSS从Webpack打包流程中剥离,直接在manifest的content_scripts里声明:

// manifest.json
"content_scripts": [
    {
        "matches": ["<all_urls>"],
        "css": ["style.css", "font-style.css"], // 新增单独的字体样式文件
        "js": ["content.js"]
    }
]

在font-style.css中使用__MSG_@@extension_id__占位符,Chrome会自动替换,content.js里直接引用字体名即可,无需再处理路径。

方法3:Webpack配置中注入扩展ID

使用Webpack的DefinePlugin,在构建时将__MSG_@@extension_id__替换为chrome.runtime.id:

// webpack.config.js
const webpack = require('webpack');

module.exports = {
    // 其他配置
    plugins: [
        new webpack.DefinePlugin({
            '__MSG_@@extension_id__': 'chrome.runtime.id'
        })
    ]
};

Webpack打包时会把代码中的__MSG_@@extension_id__替换为chrome.runtime.id,运行时会直接获取真实的扩展ID。


内容的提问来源于stack exchange,提问作者wyc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:55:15