私は、MongoDBと連動するスモールノードプロジェクトの作業を開始しました。ただし、npm
を使用して適切にインストールしたにもかかわらず、関連するノードモジュールを正しくインポートすることはできません。
たとえば、次のコードは「エクスプレスにはデフォルトのエクスポートがありません」と言ってエラーをスローします。
import express from "express";
ただし、このコードは機能します。
const express = require("express");
だから私の質問は、インポートと変数/要求メソッドの機能の違いは何ですか?追加の問題を引き起こす可能性があるため、プロジェクトのインポートに問題があるものを修正したいです道を下って。
require
とimport
の違いを理解するのに役立つ答えは、 Node.jsを使用するのとES6のインポート/エクスポートを使用する で、簡単な図が含まれています。
require
とimport
の主な違いは、require
がnode_modules
を自動的にスキャンしてモジュールを見つけることですが、ES6からのimport
はそうではないことです。
ほとんどの人は babel を使用してimport
およびexport
をコンパイルします。これにより、import
はrequire
と同じように動作します。
Node.jsの将来のバージョンはimport
自体をサポートする可能性があり(実際、 実験バージョンは既にサポートしています )、Node.jsのメモから判断すると、import
はサポートしませんnode_modules
、ES6に基づいており、モジュールのパスを指定する必要があります。
したがって、import
をbabelで使用しないことをお勧めしますが、この機能はまだ確認されていません。将来的にnode_modules
をサポートする可能性があります。
参考までに、以下にbabelがES6のimport
構文をCommonJSのrequire
構文に変換する方法の例を示します。
Fileapp_es6.js
にこのインポートが含まれているとします。
import format from 'date-fns/format';
これは、ノードパッケージ date-fns から format 関数をインポートするためのディレクティブです。
関連するpackage.json
ファイルには、次のようなものが含まれます。
"scripts": {
"start": "node app.js",
"build-server-file": "babel app_es6.js --out-file app.js",
"webpack": "webpack"
}
関連する.babelrc
ファイルは次のようなものです。
{
"presets": [
[
"env",
{
"targets":
{
"node": "current"
}
}
]
]
}
build-server-file
ファイルで定義されているこのpackage.json
スクリプトは、app_es6.js
ファイルを解析してファイルapp.js
を出力するためのbabelのディレクティブです。
build-server-file
スクリプトを実行した後、app.js
を開いてdate-fns
インポートを探すと、これが次のように変換されていることがわかります。
var _format = require("date-fns/format");
var _format2 = _interopRequireDefault(_format);
そのファイルのほとんどは、ほとんどの人間にとってはぐちゃぐちゃなものですが、コンピューターはそれを理解しています。
また、参照用に、モジュールを作成してプロジェクトにインポートする方法の例として、date-fns
をインストールしてからnode_modules/date-fns/get_year/index.js
を開くと、次のものが含まれていることがわかります。
var parse = require('../parse/index.js')
function getYear (dirtyDate) {
var date = parse(dirtyDate)
var year = date.getFullYear()
return year
}
module.exports = getYear
上記のbabelプロセスを使用すると、app_es6.js
ファイルに以下を含めることができます。
import getYear from 'date-fns/get_year';
// Which year is 2 July 2014?
var result = getYear(new Date(2014, 6, 2))
//=> 2014
そしてbabelはインポートを次のように変換します。
var _get_year = require("date-fns/get_year");
var _get_year2 = _interopRequireDefault(_get_year);
それに応じて、関数へのすべての参照を処理します。
Require&importでエクスプレスモジュールを含める例を示します
-必須
var express = require('express');
-インポート
import * as express from 'express';
したがって、上記のステートメントのいずれかを使用すると、「エクスプレス」と呼ばれる変数が作成されます。これで、「app」変数を次のように定義できます。
var app = express();
したがって、「CommonJS」では「require」を、「ES6」では「import」を使用します。
「必須」と「インポート」の詳細については、以下のリンクをご覧ください。
require- Node.jsのモジュールが必要:知っておく必要があるすべて
import- Node.jsのES6モジュールの更新
ここでの回答ではなく、コメントのようなものです。申し訳ありませんが、コメントできません。
ノードV10では、--experimental-modules
フラグを使用して、import
を使用することをNodejsに指示できます。ただし、エントリスクリプトは.mjs
で終わる必要があります。
これはまだ実験的なものであり、本番環境では使用しないでくださいことに注意してください。
// main.mjs
import utils from './utils.js'
utils.print();
// utils.js
module.exports={
print:function(){console.log('print called')}
}