Почему преобразование ESM в CommonJS не так просто найти и заменить?
Я работал над проектом TypeScript (для среды NodeJs), поэтому я использовал синтаксис модуля ES для импорта и экспорта. Использование TSC с "module": "commonjs", "esModuleInterop": true
Существует множество стандартных кодов, таких как:
var __importStar = (this && this.__importStar) || function (mod) {
// omitted
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = require("path"); // renamed identifier
const pug_1 = __importDefault(require("./template/pug"));
pug_1.default(...) // use of .default
Итак, мой вопрос, почему мы не можем просто конвертировать импорт / экспорт ESM в обычный require
вызовы NodeJ и зачем нужен этот шаблонный код и переименование идентификатора?
Например, почему следующие преобразования не могут быть выполнены простым поиском и заменой (с регулярным выражением или некоторым анализом):
import * as path from "path";
// const path = require("path");
import { resolve } from "path";
// const { resolve } = require("path");
export default class MyClass {...}
// module.exports = class MyClass {...}
export class MyClass {...}
// module.exports.MyClass = class MyClass {...}
1 ответ
Это не отображение 1:1. Например, используя синтаксис импорта / экспорта ES6, вы можете экспортировать несколько символов и один символ по умолчанию. Чтобы сделать то же самое в CommonJS, вам нужно начать вложение экспортируемых объектов в другие экспортируемые объекты, что может вызвать проблемы.