UNPKG

takin

Version:

Front end engineering base toolchain and scaffold

79 lines 3.82 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.importJsOrMjsOrTsFromFile = void 0; const fs_extra_1 = __importDefault(require("fs-extra")); const url_1 = require("url"); const logger_1 = require("../logger"); const bundleMjsOrTsFile_1 = require("./bundleMjsOrTsFile"); const interopRequireDefault_1 = require("./interopRequireDefault"); const requireResolve_1 = require("./requireResolve"); /** * 载入并解析 js、mjs 或 ts 文件 * @returns import 的结果 */ async function importJsOrMjsOrTsFromFile({ cwd, filePath, isMjs, isTs, tempFilePath, autoDeleteTempFile = false }) { var _a; let importedFile; const start = Date.now(); if (!importedFile && isMjs) { const fileUrl = (0, url_1.pathToFileURL)(filePath); if (isTs) { // 参见: https://nodejs.org/docs/latest-v12.x/api/esm.html#esm_experimental_loaders // 为了避免让用户在使用 node 的时候手动添加 --experimental-loader // 这里需要做一点 hack: // 把 ts 转换为 js 并写入到文件中, // 使用 node 原生的 esm 加载文件, 然后删除. const code = await (0, bundleMjsOrTsFile_1.bundleMjsOrTsFile)(cwd, filePath, true); await fs_extra_1.default.outputFile(tempFilePath, code, 'utf-8'); importedFile = (await eval(`import('${(0, url_1.pathToFileURL)(tempFilePath)}?t=${Date.now()}')`)).default; logger_1.logger.debug(`TS + native esm 文件已加载, 耗时: ${Date.now() - start}ms`, fileUrl); } else { importedFile = (await eval(`import(fileUrl + '?t=${Date.now()}')`)) .default; logger_1.logger.debug(`native esm 文件已加载, 耗时: ${Date.now() - start}ms`, fileUrl); } } if (!importedFile && !isTs && !isMjs) { // 1. 假设为 commonjs, 直接引用 try { // 清理 require 缓存 delete require.cache[(0, requireResolve_1.requireResolve)(filePath)]; importedFile = require(filePath); logger_1.logger.debug(`cjs 文件已加载, 耗时: ${Date.now() - start}ms`, filePath); } catch (e) { const ignored = new RegExp([ `Cannot use import statement`, `Must use import to load ES Module`, // some Node 12.x versions don't have esm detection // so it throws normal syntax errors when encountering esm syntax `Unexpected token`, `Unexpected identifier` ].join('|')); if (!ignored.test(e.message)) { throw e; } } } if (!importedFile) { // 2. 如果运行到这里, 则代表文件为 ts 或者使用了 es import 语法 const code = await (0, bundleMjsOrTsFile_1.bundleMjsOrTsFile)(cwd, filePath); await fs_extra_1.default.outputFile(tempFilePath, code, 'utf-8'); delete require.cache[(0, requireResolve_1.requireResolve)(tempFilePath)]; importedFile = (_a = (0, interopRequireDefault_1.interopRequireDefault)(require(tempFilePath))) === null || _a === void 0 ? void 0 : _a.default; logger_1.logger.debug(`ts 或 esm 文件已加载, 耗时 ${Date.now() - start}ms`, filePath); } // 自动删除临时文件 if (autoDeleteTempFile) { if (await fs_extra_1.default.pathExists(tempFilePath)) { await fs_extra_1.default.remove(tempFilePath); } } return importedFile; } exports.importJsOrMjsOrTsFromFile = importJsOrMjsOrTsFromFile; //# sourceMappingURL=importJsOrMjsOrTsFromFile.js.map