2

我正在开发一个 vscode 扩展,并正在使用esbuild它来进行捆绑/缩小。我想使用jsonc-parser NPM 模块。当我这样做时,esbuild运行正常,但无法加载扩展,出现错误“激活扩展失败:找不到模块'./impl/format'”。我可以在比整个 vscode 扩展更小的示例中重现这一点,请参见以下内容:

主文件

import * as jsonc from 'jsonc-parser'
const example = '// Some comment\n{"a":1,"b":2}'
console.log(`Parsing ${example}`)
const errors = []
const mexample = jsonc.parse(example, errors)
console.log(`Result: ${JSON.stringify(mexample, null, 2)}`)
console.log(`Errors: ${JSON.stringify(errors)}`)

相关位package.json

"scripts": {
    "run-bundle": "node out.js",
    "bundle": "esbuild index.ts --bundle --platform=node --outfile=out.js"
  },
  "dependencies": {
    "jsonc-parser": "^3.0.0"
  },
  "devDependencies": {
    "esbuild": "^0.12.28"
  }

在捆绑的 out.js 中,我可以看到

      var formatter = require2("./impl/format");
      var edit = require2("./impl/edit");
      var scanner = require2("./impl/scanner");
      var parser = require2("./impl/parser");

所以看起来esbuild还没有选择这些“内部依赖项”进行捆绑。

我尝试了一些选项,tsconfig.jsonpackage.json没有成功。

4

1 回答 1

1

我在 GitHub 上提出了一个问题,并收到了用户 hyrious 的以下解释和解决方法

这是因为 jsonc-parser 库导出了一个间接使用 require() 的 UMD 文件,这会阻止 esbuild 分析和捆绑这些依赖项。作为一种快速解决方案,您可以通过附加此选项在模块字段中使用其 ESM 目标:--main-fields=module,main。

和来自埃文

让 esbuild 自动处理这个超出了范围,因为 esbuild 仅处理可以在编译时静态评估的 require 调用,而无需部分评估输入的 JavaScript 代码。包对打包程序不友好是包的问题,​​而不是 esbuild 的问题。如上所述,解决方法是:

  • 使用 --main-fields=module,main (可能会导致其他包出现问题)
  • 使用 onResolve 编写一个 esbuild 插件来交换这个文件(不会影响其他包)
  • 让微软让他们的代码打包器友好
于 2021-09-27T19:29:05.847 回答