gpt4 book ai didi

javascript - Nodejs - 将 mjs 文件中的内容导入 js 文件或如何在 mjs 文件中使用 require?

转载 作者:行者123 更新时间:2023-12-04 17:21:40 68 4
gpt4 key购买 nike

我是 JS 和 Node.js 的新手。从我读到的似乎是ES6 import is not supported in Node所以我被迫使用experiment mode (renaming my file to mjs)
这在大多数情况下都有效,除非 mjs 文件需要使用 require .我目前的解决方案是将依赖于 require 的代码块拆分为单独的 .js 文件并导入该 js 文件
foo.mjs

import readFileSync from './util.js'
...
//orignally just do require('fs') and do fs.readFileSync()
const configFile = readFileSync(configFilePath);

实用程序.js
const fs = require('fs');
const path = require('path');

function readFileSync(filePath) {
console.log(__dirname)
console.log(path.resolve(__dirname, filePath))
return fs.readFileSync(path.resolve(__dirname, filePath), 'utf8');
}

module.exports = readFileSync

有没有办法避免这样做?我的 app.js 有很多 require而且我不想将所有这些部分分解为单独的 js 文件。
我尝试将要求更改为导入
// const express = require('express');
import * as express from 'express';
但是当运行 node --experimental-modules app.mjs我收到一个错误
TypeError: express is not a function
我想我需要
  • 想办法使用require在 mjs
  • 或者想办法将mjs中的东西导入js文件
  • 最佳答案

    你有三个不错的选择:

  • 使用 Babel 或 TypeScript 获得两种模块之间的互操作性
  • 写一个小包装器来重新定义require在 ESM 代码中
  • 使用import() (动态导入)在您的 CJS 中导入 ESM 代码

  • 要使用的包装器 require在 ESM 代码中:
    import { createRequire } from 'module'
    const require = createRequire(import.meta.url)
    const cjsFile = require('./test') // test is regular .js file using module.exports
    动态导入:
    // foo.mjs:
    export const foo = () => true
    // index.js:
    import('./foo.mjs').then(x => console.log(x.foo()))
    具有混合模块类型的大型项目经常使用 Babel 和/或 TypeScript,它们都可以很好地处理混合类型。 Babel 会更容易学习和设置。但是,如果您没有大量代码需要处理, createRequire方法工作得很好。
    至于 Express 的问题,它失败了,因为默认导出是您想要的: import express from 'express' ,而不是 import * as express... .

    关于javascript - Nodejs - 将 mjs 文件中的内容导入 js 文件或如何在 mjs 文件中使用 require?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65784124/

    68 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com