gpt4 book ai didi

javascript - Babel `import` 的 Codemod 到 commonjs `require`

转载 作者:搜寻专家 更新时间:2023-10-31 23:06:55 25 4
gpt4 key购买 nike

我正在寻找一种将完整 Node 项目的 Babelimport 转换为 CommonJS 样式的 require() 的方法。目标是摆脱 Babel。

考虑到现在 node.js 内置了 async/await 之类的东西,运行 Babel 感觉是多余的。 Babel 目前唯一要做的就是将 ES6 风格的 import 转换为 require()

我一直在搜索,但找不到任何优雅的半自动解决方案。编译 Babel 时的输出不够干净,无法在没有大量手动工作的情况下进行复制。

如果我有一个包含这样输入的文件:

import express from 'express'
import bodyParser from 'body-parser'
import authMiddleware from './middlewares/auth'
import { get } from 'lodash'

export const myVar = 1
export default function doSomething() {
// ...
}

.. 我想要类似这样的输出

const express = require('express')
const bodyParser = require('body-parser')
const authMiddleware = require('./middlewares/auth').default
const { get } = require('lodash')

export.myVar = 1
export.default = function doSomething() {
// ...
}

或者,它将文件转换为 .mjs 相关文件的语法,并使用 require() 处理外部内容。

这不是我第一次有一个运行 Babel 的旧 Node 项目,它随着时间的推移变得越来越冗余,所以我确信之前有人已经对此做了巧妙的解决方案。

最佳答案

我挖掘了babel-plugin-transform-modules-commonjs的源代码.看起来不可能配置 babel 来输出你想要的结果。

背后的原因是像 _interopRequireDefault 这样的助手的必要性仍然很强,因为 ES 模块不向后兼容 commonjs,特别是 export default 东西。

举个例子:

// input
import bodyParser from 'body-parser'
import authMiddleware from './middlewares/auth'

// your desired output
const bodyParser = require('body-parser') // <-- no default
const authMiddleware = require('./middlewares/auth').default // <-- default

// actual babel output
var _bodyParser = _interopRequireDefault(require("body-parser"));
var _auth = _interopRequireDefault(require("./middlewares/auth"));

您无法判断何时添加 .default 以及何时不添加。处理此问题的唯一正确方法是使用 _interopRequireDefault 包装 require() 并进行运行时检查。

如果编译器确实跟踪所需的模块并检查它是 ES 模块还是 commonjs 模块,那么它可以判断是否需要 .default。然而 babel 是围绕一次一个文件的模型设计的,所以它不可能为你做到这一点。

我认为,如果您能找出一个可靠的规则来判断何时添加 .default 以及何时不添加,那么也许一个简单的正则表达式替换就能解决您的问题。


边注。我确实有一些想法可以使用自定义的 babel 插件来破解它。

你可以 fork babel-plugin-transform-modules-commonjs 源代码,移除 _interopRequireDefault 包装逻辑,然后你使用解析器来做前面提到的 check-if -requiree-is-esmodule 作业,然后查看输出中是否需要 .default

但是说起来容易做起来难,这需要认真的努力。

关于javascript - Babel `import` 的 Codemod 到 commonjs `require`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55768998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com