“require (x)”와“import x”의 차이점


190

방금 MongoDB와 인터페이스 할 작은 노드 프로젝트를 시작했습니다. 그러나를 통해 올바르게 설치했지만 관련 노드 모듈을 올바르게 가져올 수없는 것 같습니다 npm.

예를 들어 다음 코드는 "express에 기본 내보내기가 없습니다"라는 오류를 표시합니다.

import express from "express";

그러나이 코드는 작동합니다.

const express = require("express");

내 질문은 import 및 variable / require 메소드의 기능 차이가 무엇입니까? 프로젝트에서 수입에 어려움을 겪고있는 것을 고치고 싶습니다. 도로에 추가 문제가 발생할 가능성이 있기 때문입니다.


express에 대한 타이핑 정의를 포함하지 않으면 첫 번째 양식은 의미가 없으므로 두 번째 양식을 사용할 수 있지만 변수 express는 유형 any입니다. 여기에 정의를 포함시킬 수 있습니다. npmjs.com/package/@types/express
Filipe Sabella

답변:


226

나에게 도움이 간단한 다이어그램의 차이 이해 requireimport.

여기에 이미지 설명을 입력하십시오

그 외에도,

당신은 할 수없는 선택적으로 당신이 필요한 부분 만로드 require하지만과를 imports, 당신은 선택적으로 필요한 경우에만 조각을로드 할 수 있습니다. 메모리를 절약 할 수 있습니다.

반면에 로딩은 (단계적으로) 동 기적입니다.require 반면에 import(이전 가져 오기를 기다리지 않고) 비동기적일 있기 때문에 보다 약간 더 잘 수행수 있습니다require .


코드에 영향을 미치는 가장 큰 차이점은 CommonJS 모듈의 내보내기는 "계산 된"반면 ESM 모듈의 내보내기는 정적 (사전 정의 된)입니다. JS는 코드를 구문 분석 한 후 (아직 실행하지 않은 경우) ESM 모듈에서 내보내기를 확인할 수 있습니다. commonJS 모듈에서 내보내기는 모듈이 실제로 실행될 때만 알려져 module.exports있으며 모듈 초기화 코드 실행이 완료되면 할당 된 내용을 볼 수 있습니다 . 이 차이만으로도 단일 모듈을 ESM 및 CommonJS에서 작동 시키려고 할 때 호환성 문제가 발생합니다.
jfriend00

ESM 모듈은 번 들러에 친숙하지만 ESM 모듈에서 내보내기를 계산할 수 없기 때문에 코더에 더 제한적입니다.
jfriend00

76

가장 큰 차이점 require하고 import, 즉 require자동으로 스캔 node_modules모듈을 찾을 수 있지만 import, ES6에서 오는,하지 않습니다.

대부분의 사람들은 사용 바벨을 컴파일 import하고 export만드는, import같은 행동 require.

Node.js의 향후 버전은 import자체적으로 지원할 수 있으며 (실제로 실험 버전은 이미 수행하고 있음 ) Node.js의 노트로 판단 import하면 node_modulesES6을 기반으로 지원하지 않으며 모듈의 경로를 지정해야합니다.

그래서 나는 당신 import이 babel과 함께 사용하지 말 것을 제안 하지만,이 기능은 아직 확인되지 않았습니다 node_modules. 향후에 지원할 수 있습니까?


참고로 아래는 babel이 ES6의 import구문을 CommonJS의 require구문으로 변환하는 방법의 예입니다 .

파일 app_es6.js에이 가져 오기가 포함되어 있다고 가정하십시오 .

import format from 'date-fns/format';

이것은 노드 패키지 date-fns 에서 형식 함수 를 가져 오는 지시문 입니다.

관련 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는 babel이 app_es6.js파일 을 구문 분석하고 파일을 출력 하기위한 지시문입니다 app.js.

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

그리고 함수에 대한 모든 참조를 적절히 처리하십시오.


aaaaahhhhhh. 이 특정 프로젝트에는 Babel이 설치되지 않았으므로 모든 것이 의미가 있습니다. ES6 수입 / 수출은 이미 기능적이라고 생각했지만 이제는 Babel이 모든 것을 require어쨌든 바꾸고 있음을 이해 합니다
austinthemassive

지금 당장 요구하십시오. 당신은 언제든지 아무런 문제없이 언제든지 바꿀 수 있습니다
Juan

1
import won't support node_modules그게 무슨 소리 니?
PrivateOmega

11

require & import가 포함 된 Express 모듈 포함에 대한 예를 들어 보겠습니다.

-필요

var express = require('express');

-수입

import * as  express from 'express';

따라서 위의 문장 중 하나를 사용한 후에는 'express'라는 변수가 있습니다. 이제 'app'변수를 다음과 같이 정의 할 수 있습니다.

var app = express(); 

따라서 'CommonJS'에는 'require'를 사용하고 'ES6'에는 'import'를 사용합니다.

'필수'및 '가져 오기'에 대한 자세한 내용은 아래 링크를 참조하십시오.

require- Node.js의 모듈 필요 : 알아야 할 모든 것

import- Node.js의 ES6 모듈에 대한 업데이트


3

여기에 답변이 아니며 의견과 비슷합니다. 죄송하지만 의견을 말할 수 없습니다.

노드 V10에서는 플래그 --experimental-modules를 사용하여 Nodejs에게 사용하고 싶다고 말할 수 있습니다 import. 그러나 입력 스크립트는로 끝나야합니다 .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 문제


3

새로운 ES6 :

'import'는 'export'키워드와 함께 사용하여 js 파일간에 변수 / 배열 / 객체를 공유해야합니다.

export default myObject;

//....in another file

import myObject from './otherFile.js';

오래된 스쿨 :

'require'는 'module.exports'와 함께 사용해야합니다

 module.exports = myObject;

//....in another file

var myObject = require('./otherFile.js');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.