繁体   English   中英

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

[英]Nodejs - import stuff from mjs file into js file OR how to use require in mjs file?

我是 JS 和 Node 的新手。 从我阅读的内容来看,Node 似乎不支持 ES6 导入,所以我被迫使用实验模式(将我的文件重命名为 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

我想我需要

  • 找到一种在 mjs 中使用require的方法
  • 或者想办法将mjs中的东西导入js文件

你有三个不错的选择:

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

在 ESM 代码中使用require的包装器:

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...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM