【问题标题】:How to get esbuild to include internal dependencies when using typescript使用 typescript 时如何让 esbuild 包含内部依赖项
【发布时间】:2021-09-16 12:47:46
【问题描述】:

我正在开发一个 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 中尝试了一些选项,但没有成功。

【问题讨论】:

    标签: typescript esbuild


    【解决方案1】:

    我在 GitHub 上提出了issue 并收到了用户 hyrious 的以下解释和解决方法

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

    来自伊万w

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

    • 使用 --main-fields=module,main(可能会导致其他包出现问题)
    • 使用 onResolve 编写一个 esbuild 插件,只换出这个文件(不会影响其他包)
    • 让 Microsoft 让他们的代码捆绑器友好

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2017-08-04
    • 2014-04-04
    • 1970-01-01
    • 2018-03-02
    • 2011-10-23
    • 2020-01-07
    相关资源
    最近更新 更多