Почему преобразование 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, вам нужно начать вложение экспортируемых объектов в другие экспортируемые объекты, что может вызвать проблемы.

Другие вопросы по тегам