- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在寻找一种将完整 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/
我一直在努力使用 jscodeshift 将新对象添加到对象数组。我的问题是在获得 VariableDeclarator 后,我不知道如何查询数组。在插入新节点之后,我需要获取数组中的最后一个元素。这
我想编写几个脚本来自动检测丢失的导入并根据根目录导入它们。将此脚本编写为 codemod 脚本还是作为带有修复选项的 eslint 规则更好? 最佳答案 Codemods 用于迁移,而 linting
我正在执行 codemod/transform 以更改代码中的 if/return 语句。 我有很多if(err) do something,我需要重构那个行为。 我如何为此进行转换? 我有什么: i
我正在尝试编写一个小型 codemod 来重构一些代码。考虑一下我有这样的东西: import { mod1, mod2, mod3 } from 'package1' import localMod
我有一个我想要转换的代码模块 for (var key in foo){} 进入 for (var keys = 0; key { var prop = p.node.left.de
我正在从 Material-UI 0.x 更新到 1.0。 migration-helper 的文档说跑: jscodeshift -t . 我以前从未使用过 jscodeshift,也从未见过这
我正在寻找一种将完整 Node 项目的 Babelimport 转换为 CommonJS 样式的 require() 的方法。目标是摆脱 Babel。 考虑到现在 node.js 内置了 async/
我是一名优秀的程序员,十分优秀!