使用 Node.js v12.2.0,我可以像这样导入所有标准模块:
import * as Http from 'http'
import * as Fs from 'fs'
import * as Path from 'path'
import * as Readline from 'readline'
import * as Os from 'os'
与我之前所做的相比:
const
Http = require('http')
,Fs = require('fs')
,Path = require('path')
,Readline = require('readline')
,Os = require('os')
只要在 ECMAScript 模块的 package.json 文件中有这个字段,就可以导入任何模块而无需使用 .mjs 扩展名:
"type": "module"
确保在创建模块的同一文件夹中放置包含package.json文件的文件夹。
如果要导入没有更新为ECMAScript模块支持的模块,可以像这样操作:
import { createRequire } from 'module'
const require = createRequire(import.meta.url)
const
WebSocket = require('ws')
,Mime = require('mime-types')
,Chokidar = require('chokidar')
当然,不要忘记这是使用模块导入实际运行脚本所必需的(在v13.2之后不再需要):
node --experimental-modules my-script-that-use-import.js
同时父文件夹需要这个package.json文件,否则该脚本会因导入语法问题而出错:
{
"type": "module"
}
如果你想使用的模块还没有更新以支持使用import语法导入,则除了使用require之外别无选择(但使用我上面的解决方案就不是问题了)。
我还想分享这段代码,它实现了模块中缺少的__filename
和__dirname
常量:
import {fileURLToPath} from 'url'
import {dirname} from 'path'
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
{"type": "module"}
,才能使用 ES6 的 import 语法。根据文档,当最近的父级 package.json 文件包含顶级字段"type"
并且值为"module"
时,文件名以 .js 结尾或没有扩展名的文件将被作为 ES 模块加载。更多信息请参见:https://nodejs.org/api/esm.html#esm_package_json_type_field - Lukas Liesis