代码之家  ›  专栏  ›  技术社区  ›  Sid Vishnoi Sumit Das

为什么将ESM转换为CommonJS不是简单的查找和替换?

  •  0
  • Sid Vishnoi Sumit Das  · 技术社区  · 6 年前

    我一直在做一个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以及为什么需要这个样板代码和标识符重命名?

    例如,为什么不能通过简单的查找和替换(使用regex或某些解析)完成以下转换:

    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 回复  |  直到 6 年前
        1
  •  0
  •   Petr Broz    6 年前

    这不是1:1的映射。例如,使用ES6导入/导出语法,可以导出多个符号 默认符号。要在CommonJS中执行同样的操作,您需要开始将导出的对象嵌套到其他可能导致问题的导出对象中。

    推荐文章