如何更改这些模块的require语句以使用import语句?

时间:2019-05-06 01:50:42

标签: javascript node.js import module require

由于节点版本11现在支持ES6,因此我希望不再对以下模块使用require()语句,但是除了express作为{{1之外,我无法找到关于如何编写以下内容的任何文档。 }}语句:

import

import express from "express"; const http = require('http'); import bodyParser from 'body-parser'; const morgan = require('morgan'); bodyParser的{​​{1}}一样吗?

例如morgan,我只看到:

http

对于morgan,我只看到:

import logger from 'morgan';

2 个答案:

答案 0 :(得分:1)

require是模块的主要语法(在Node中)。正如Patrick Roberts提到的,您只能将它们用于.mjs(模块JS)文件。 require是导入NPM软件包/节点模块的方式:

const express = require("express");
const http = require("http");
const bodyParser = require("body-parser");
const morgan = require("morgan");

如果您确实希望使用ES6 import/export,则需要使用.mjs,如here所述。

答案 1 :(得分:0)

使用Node 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模块都可以导入,而无需使用.mjs扩展名,只要它的package.json文件中包含以下字段即可:

"type": "module"

因此,请确保将package.json文件放在与要创建的模块相同的文件夹中。

要导入未使用ECMAScript模块支持更新的模块,您可以这样做:

// Implement the old require function
import { createRequire } from 'module'
const require = createRequire(import.meta.url)

// Now you can require whatever
const
  WebSocket = require('ws')
  ,Mime = require('mime-types')
  ,Chokidar = require('chokidar')

当然,不要忘记使用模块导入来实际运行脚本是必需的:

node --experimental-modules my-script-that-use-import.js

并且该文件夹的父文件夹需要该package.json文件,才能不抱怨导入语法:

{
  "type": "module"
}

如果您要使用的模块尚未更新以支持使用import语法导入,那么除了使用require之外,您别无选择(但是上面的解决方案没有问题)。