NodeJS SWC的捆绑器编译为ES6导入,而不是要求

kknvjkwl  于 2023-03-17  发布在  Node.js
关注(0)|答案(2)|浏览(185)

在将ES6导入转换为commonjs require()时,是否可以让SWC捆绑TypeScript文件?不确定是否由于我有限的理解而无法使其工作,或者是否我错过了某个选项。
基本上,我有一个入口TS文件,它通过一个简单的import convert from 'xml-js';导入一个外部库。

module.exports = {
  module: {
    type: 'commonjs',
  },
  options: {
    jsc: {
      target: 'es2018',
      parser: {
        syntax: 'typescript',
        // isModule: true,
        // dynamicImport: true,
    },
  },
  externalModules: ['xml-js'],
  entry: {
    'loader': __dirname + '/src/loader.ts',
  },
  output: {
    path: __dirname + '/dist',
  },
}

我希望这个包包含一个commonjs require()(由于type: 'commonjs'),但结果却是import convert from "xml-js";。我尝试了很多不同的配置选项,但每次尝试的结果都是一样的。
当我将Rollup与rollup-plugin-typescript 2一起使用时,它确实会导致require():var convert = require('xml-js');这也是我期望SWC的捆绑器工作的方式。
我的感觉是SWC也应该有能力做到这一点,但我不确定如何做到。任何正确方向的暗示都非常感谢。
谢谢!

4xrmg8kj

4xrmg8kj1#

你当然可以。Here's the documentation from the SWC website.
你已经包含了所需的type: "commonjs",但是在错误的地方。我没有使用Spack或其他配置文件,但是看起来你的文件应该这样说:

module.exports = {
  options: {
    module: {
      type: 'commonjs',
    },
    jsc: {
      target: 'es2018',
      parser: {
        syntax: 'typescript',
        // isModule: true,
        // dynamicImport: true,
      }
    },
  },
  // ...
}

对于使用.swcrc配置文件的用户(请记住删除注解):

{
  "$schema": "https://json.schemastore.org/swcrc",
  "module": {
    "type": "commonjs" // can be "es6", "umd", or "amd"
  },
  // any other options
}
4ioopgfo

4ioopgfo2#

我也遇到了这个问题:当前SWC无法将commonjs的require()转换为esm的import,只能将esm转换为commonjs。

{
   "jsc": {
     "target": "esnext",
   }
   "module": {
     "type": "es6"
   },
}

顺便说一句:SWC捆绑器是另一个相关的项目(目前仍处于早期阶段)。SWC是代码转发器。
我试过esbuild,但它仍然不支持spiling require

npx esbuild src/custom.cjs --format=esm --outfile=custom.mjs
▲ [WARNING] Converting "require" to "esm" is currently not supported [unsupported-require-call]

目前可能只有babel可以支持:https://babeljs.io/docs/babel-plugin-transform-modules-commonjs
最后,目前我的结论是,如果您想使用较新的代码转换器(如SWC/esbuild),最好使用ESM编写代码并将其转换为commonjs,否则请使用babel

相关问题