takin
Version:
Front end engineering base toolchain and scaffold
79 lines • 3.82 kB
JavaScript
;
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