Я работал над проектом 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
для NodeJs и зачем нужен этот шаблонный код и переименование идентификатора?
Например, почему следующие преобразования не могут быть выполнены простым поиском и заменой (с регулярным выражением или некоторым синтаксическим анализом):
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. Например, используя синтаксис импорта / экспорта ES6, вы можете экспортировать несколько символов а также как символ по умолчанию. Чтобы сделать то же самое в CommonJS, вам нужно будет начать вложение экспортируемых объектов в другие экспортируемые объекты, что может вызвать проблемы.
@SudhanshuVishnoi: да, и именно поэтому у Babel есть флаг noInterop, а в машинописном тексте - флаг esModuleInterop.
Итак, если кто-то будет использовать импорт / экспорт согласованным способом (без экспорта по умолчанию), можно будет записать преобразования 1: 1, верно?