Vite 打包 vscode 扩展遇到的模块问题

发布于:2025-06-23 ⋅ 阅读:(13) ⋅ 点赞:(0)

一、现象

我们开发的一个 vscode 扩展“小塔”,是一个 AI编程助手,其中的 webview 页面在用 vite 打包为 index.js 后,会在 vscode 的 webview 组件中无法装载,报告:
Uncaught SyntaxError: Unexpected token ‘export’。

二、原因

原来是因为 webview 中装载 js 时没有指定参数 type=‘module’,而浏览器装载时是指定了的。
浏览器:
[图片]
Vscode 的 webview:
[图片]

三、解决办法:添加 type=“module” 参数

在webview的引导页面中加上 type=“module” 参数即可。

<script nonce="${nonce}" src="${scriptUri}" type="module"></script>

四、type=“module” 参数的作用

type=“module” 的核心作用是明确声明引用的 JavaScript 文件是一个 ECMAScript Module (ESM)。
具体来说,它带来了以下几个关键影响和行为:

  1. 启用 ES 模块语法解析: 这是最主要的作用。当浏览器看到 type=“module” 时,它会按照 ES 模块的规范来解析脚本。这意味着你可以在这个文件中使用 import 和 export 关键字来导入和导出模块,而不会导致 SyntaxError(比如你之前遇到的 Unexpected token ‘export’ 错误)。如果没有 type=“module”,浏览器会将文件视为普通脚本,不识别 import 和 export 语法。

  2. 默认延迟执行 (Deferred Execution): 带有 type=“module” 的脚本默认行为是 异步加载和延迟执行,类似于给普通

  • 加载:脚本的下载不会阻塞 HTML 的解析。
  • 执行:脚本会在 HTML 文档完全解析完成后,但在 DOMContentLoaded 事件触发之前执行。
  • 这意味着你的模块脚本可以安全地访问和操作 DOM,而无需等待 DOMContentLoaded 事件,因为它们保证在 DOM 准备就绪后执行。
  1. 默认严格模式 (Strict Mode): 所有 ES 模块默认在 严格模式 (Strict Mode) 下运行。这意味着你不需要在文件顶部添加 “use strict”;。严格模式有助于编写更健壮、更少错误的代码(例如,禁止使用未声明的变量,禁止 with 语句等)。

  2. 模块作用域 (Module Scope): 在 ES 模块中,顶级声明(例如 var, let, const, function, class)默认是模块私有的,而不是像传统脚本那样污染全局作用域 (window 对象)。只有通过 export 导出的内容才能被其他模块导入和使用。这大大减少了命名冲突的风险,提高了代码的封装性和可维护性。

  3. 模块加载机制 (Module Loader): 浏览器会使用其内置的模块加载器来处理带有 type=“module” 的脚本。这个加载器负责解析模块之间的 import 语句,获取依赖的模块,并确保它们只被解析和执行一次(即使被多个模块导入)。它还处理模块之间的循环依赖等复杂情况。

  4. CORS 要求 (Cross-Origin Policy): 通过 src 属性加载的跨域模块(不同源的脚本)默认会受到 CORS (跨域资源共享) 策略的限制。这意味着你需要服务器端正确配置 CORS 头才能加载这些模块。相比之下,普通脚本默认不会受到那么严格的 CORS 检查(尽管其他安全限制依然存在)。


网站公告

今日签到

点亮在社区的每一天
去签到