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

OLI*_*KOO 12 javascript node.js

我是 JS 和 Node 的新手。从我读到的内容来看,Node似乎不支持 ES6 导入,所以我被迫使用实验模式(将我的文件重命名为 mjs)

除非 mjs 文件需要使用require. 我当前的解决方案是将依赖于单独 .js 文件的 require 的代码块分解并导入该 js 文件

foo.mjs

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

Run Code Online (Sandbox Code Playgroud)

实用程序.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

Run Code Online (Sandbox Code Playgroud)

有什么办法可以避免这样做吗?我的 app.js 有很多require,我不想将所有这些部分分解成单独的 js 文件。

我尝试更改导入要求

// const express = require('express');
import * as express from 'express';
Run Code Online (Sandbox Code Playgroud)

但是当运行时 node --experimental-modules app.mjs

我收到一个错误

TypeError: express is not a function
Run Code Online (Sandbox Code Playgroud)

我想我需要要么

  • require找到一种在mjs中使用的方法
  • 或者找到一种方法将 mjs 中的内容导入到 js 文件中

Zac*_*ger 15

您有三个不错的选择:

  • 使用 Babel 或 TypeScript 获得两种类型模块之间的互操作性
  • 编写一个小包装器以require在 ESM 代码中重新定义
  • 在 CJS 中使用import()(动态导入)导入 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
Run Code Online (Sandbox Code Playgroud)

动态导入:

// foo.mjs:
export const foo = () => true
// index.js:
import('./foo.mjs').then(x => console.log(x.foo()))
Run Code Online (Sandbox Code Playgroud)

具有混合模块类型的大型项目经常使用 Babel 和/或 TypeScript,它们都可以很好地处理混合类型。Babel 会更容易学习和设置。但如果您没有大量代码需要处理,那么该createRequire方法就可以正常工作。

至于 Express 的问题,它失败了,因为默认导出是你想要的:import express from 'express',而不是import * as express...