ESM调用commonjs模块
最简单的方法1:
import { createRequire } from "module"; export default require("./cjs.cjs"); function require(name) { return createRequire(import.meta.url)(name) }最简单的方法2:
export default await require("./cjs.cjs"); // 导出为 ESM async function require(name) { // return createRequire(import.meta.url)(name) return new Promise((resolve, reject) => { import("url").then(({ fileURLToPath }) => { import("module").then(({ createRequire }) => { resolve(createRequire(fileURLToPath(import.meta.url))(name)) }) }) }) }桥接文件
/server/server-bridge.mjs
// server/server-bridge.mjs import { createRequire } from 'module' import { fileURLToPath } from 'url' import path from 'path' // 创建一个 require 函数,用于加载 CJS 模块 const require = createRequire(import.meta.url) const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) // 安全加载原始 CJS 模块 const serverCJS = require('./server.notebook.node.js') // 导出为 ESM export const start = serverCJS.start || serverCJS.default?.start || (() => {}) export default serverCJScommonjs模块
/server/server.notebook.node.js
const server = {start:()=>console.log("启动server")} module.exports = serveresm中使用cjs模块
import os from 'os' import fs from 'fs' import path from 'path' import { start as startServer } from './server/server-bridge.mjs' const __dirname = path.dirname(fileURLToPath(import.meta.url)) const serverPort = 3002 startServer(serverPort)commonjs调用esm模块
esm.js
export default { name: '这是esm模块' }common.js
import('../esm.js').then((m) => { console.log(m.default) })