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

Chrome扩展Manifest V3内容脚本导入crc32报模块语法错误

解决Chrome扩展内容脚本中import语句报错的问题

问题核心

在Chrome扩展的内容脚本中导入crc包后,编译后的代码保留了import语句,导致浏览器抛出Uncaught SyntaxError: Cannot use import statement outside a module错误;但相同导入在扩展内的页面和Svelte组件中能正常运行,其他依赖(如saveAs)也被正确打包成非模块形式。

原因分析

Chrome内容脚本默认不支持ES模块语法,而Vite对内容脚本的打包策略与扩展页面/Svelte组件不同:后者被配置为支持模块,而内容脚本可能被默认输出为ES模块格式,或者crc包未被正确打包进内容脚本文件,导致保留了import语句。

解决方案

方案1:将内容脚本标记为模块(Chrome 92+支持)

在manifest.json中给内容脚本添加"type": "module"声明,让Chrome以模块方式加载内容脚本:

{
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["dist/content.js"],
      "type": "module"
    }
  ]
}

注意:需确保Vite打包后的资源相对路径正确,避免模块加载失败。

方案2:配置Vite将内容脚本打包为自执行函数(IIFE)

修改vite.config.ts,强制内容脚本打包成非模块格式,把所有依赖直接嵌入文件:

import { defineConfig } from 'vite';
import { svelte } from '@sveltejs/vite-plugin-svelte';

export default defineConfig({
  plugins: [svelte()],
  // 强制预打包crc依赖
  optimizeDeps: {
    include: ['crc'],
  },
  build: {
    rollupOptions: {
      input: {
        popup: './src/popup/index.html',
        content: './src/content-script.ts',
      },
      output: {
        // 禁用代码分割,避免生成额外chunk
        manualChunks: undefined,
        // 全局输出格式设为IIFE,所有代码打包成自执行函数
        format: 'iife',
        entryFileNames: '[name].js',
        chunkFileNames: 'assets/[name].[hash].js',
      },
    },
  },
});

如果需要给不同入口设置不同格式(比如页面用ES模块,内容脚本用IIFE),可以用Rollup的多输出配置:

output: [
  {
    // 内容脚本配置
    entryFileNames: 'content.js',
    format: 'iife',
    dir: 'dist',
  },
  {
    // 页面入口配置
    entryFileNames: 'popup/[name].js',
    format: 'es',
    dir: 'dist',
  }
]

验证

重新执行打包命令后,查看dist/content.js,确认文件中不再有import语句,crc32函数已被嵌入代码中,此时内容脚本即可正常运行。

内容的提问来源于stack exchange,提问作者Web and Flow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:44:16