首页 > 解决方案 > 如何在vscode中导入mjs?

问题描述

是否可以制作由 mjs 文件组成的 vscode 扩展?

因为我尝试只使用 mjs 文件进行扩展,以便在没有 TypeScript 的情况下拥有完整的 es6 功能。但它不运行:

如果我使用$ vsce package它进行扩展不会给出任何错误,但它会产生一个在安装时不起作用的扩展:我在 package.json 中放入的贡献存在,但 vscode 显示一个错误弹出窗口,上面写着

激活扩展“my.ext”失败:必须使用导入来加载 ES 模块:c:\vsext\extension.mjs。

我尝试运行的每个命令都会出错

找不到命令“my.cmd”

如果我在调试器上运行扩展,并且标记了未捕获异常选项的断点,它将在 /src/vs/workbench/api/node/extHostExtensionService.ts:88 上中断。

经过进一步搜索,我注意到当脚本尝试加载第一个 mjs 模块时会生成此异常。

我可以做些什么来包含我的 mjs 库文件?

我认为这种行为也会影响 npm 模块与 mjs 文件的使用。


编辑

找到(某种)使用 esm 的方法:

想法是使用 esm 来处理 es6 导入并在导入的模块之间共享 vscode 对象

这看起来很棘手,但是当我尝试只输入import * as vscode from "vscode"我的 mjs 文件时,vscode 抱怨找不到模块 vscode

所以我做了以下

var vscode; // will store vscode obj
export function IMPORTVSCODE(vscodeInstance){
    vscode = vscodeInstance
}

例如

// init.js
const vscode = require("vscode")
const esm = require("esm")(module/*, options*/)
const main = esm("./main.mjs")
main.IMPORTVSCODE(vscode)
module.exports = main

// main.mjs
import * as other from "./other.mjs"
var vscode; // will store vscode obj
export function IMPORTVSCODE(vscodeInstance){
    vscode = vscodeInstance
}
function activate(){
  other.IMPORTVSCODE(vscode)
  other.methodThatNeedsVscode()
}

// other.mjs
var vscode; // will store vscode obj
export function IMPORTVSCODE(vscodeInstance){
    vscode = vscodeInstance
}
export function methodThatNeedsVscode(){
    vscode // ...use vscode
}

我的扩展现在运行良好!

但我认为可以找到更好的想法,所以如果有人有一些最好的解决方案,请分享

标签: visual-studio-codees6-modules

解决方案


推荐阅读