web-dev-qa-db-ja.com

「require(x)」とインポートxの違い

私は、MongoDBと連動するスモールノードプロジェクトの作業を開始しました。ただし、npmを使用して適切にインストールしたにもかかわらず、関連するノードモジュールを正しくインポートすることはできません。

たとえば、次のコードは「エクスプレスにはデフォルトのエクスポートがありません」と言ってエラーをスローします。

import express from "express";

ただし、このコードは機能します。

const express = require("express");

だから私の質問は、インポートと変数/要求メソッドの機能の違いは何ですか?追加の問題を引き起こす可能性があるため、プロジェクトのインポートに問題があるものを修正したいです道を下って。

64

requireimportの違いを理解するのに役立つ答えは、 Node.jsを使用するのとES6のインポート/エクスポートを使用する で、簡単な図が含まれています。

enter image description here

55
Always Sunny

requireimportの主な違いは、requirenode_modulesを自動的にスキャンしてモジュールを見つけることですが、ES6からのimportはそうではないことです。

ほとんどの人は babel を使用してimportおよびexportをコンパイルします。これにより、importrequireと同じように動作します。

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);

それに応じて、関数へのすべての参照を処理します。

31
Ayon Lee

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モジュールの更新

6
saikiran_hegde

ここでの回答ではなく、コメントのようなものです。申し訳ありませんが、コメントできません。

ノード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')}
}

参照1-Nodejs Doc

参照2-githubの問題

0
Tianpeng. Xia