我是JS和Node的新手。据我所读,它看起来像是ES6 import is not supported in Node,所以我不得不使用experiment mode (renaming my file to mjs)
除非mjs文件需要使用require,否则这在很大程度上是可行的。我的当前解决方案是将依赖于要求分离的.js文件的代码块分解出来,并导入该js文件。
foo.mjs
import readFileSync from './util.js'
...
//orignally just do require('fs') and do fs.readFileSync()
const configFile = readFileSync(configFilePath);util.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中的内容导入js文件的方法。
发布于 2021-01-19 01:03:43
你有三个不错的选择:
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,两者都可以很好地处理混合类型。巴贝尔会更容易学习和建立起来。但是,如果您没有大量的代码需要处理,那么createRequire方法就能正常工作。
至于Express的问题,它失败了,因为默认的导出是您想要的:import express from 'express',而不是import * as express...。
https://stackoverflow.com/questions/65784124
复制相似问题