[英]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
我想我需要
require
的方法你有三个不错的选择:
require
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.