방금 MongoDB와 인터페이스 할 작은 노드 프로젝트를 시작했습니다. 그러나를 통해 올바르게 설치했지만 관련 노드 모듈을 올바르게 가져올 수없는 것 같습니다 npm
.
예를 들어 다음 코드는 “express에 기본 내보내기가 없습니다”라는 오류를 표시합니다.
import express from "express";
그러나이 코드는 작동합니다.
const express = require("express");
내 질문은 import 및 variable / require 메소드의 기능 차이가 무엇입니까? 프로젝트에서 수입에 어려움을 겪고있는 것을 고치고 싶습니다. 도로에 추가 문제가 발생할 가능성이 있기 때문입니다.
답변
나에게 도움이 간단한 다이어그램의 차이 이해 require
와 import
.
그 외에도,
당신은 할 수없는 선택적으로 당신이 필요한 부분 만로드 require
하지만과를 imports
, 당신은 선택적으로 필요한 경우에만 조각을로드 할 수 있습니다. 메모리를 절약 할 수 있습니다.
반면에 로딩은 (단계적으로) 동 기적입니다.require
반면에 import
(이전 가져 오기를 기다리지 않고) 비동기적일 수 있기 때문에 보다 약간 더 잘 수행 할 수 있습니다require
.
답변
가장 큰 차이점 require
하고 import
, 즉 require
자동으로 스캔 node_modules
모듈을 찾을 수 있지만 import
, ES6에서 오는,하지 않습니다.
대부분의 사람들은 사용 바벨을 컴파일 import
하고 export
만드는, import
같은 행동 require
.
Node.js의 향후 버전은 import
자체적으로 지원할 수 있으며 (실제로 실험 버전은 이미 수행하고 있음 ) Node.js의 노트로 판단 import
하면 node_modules
ES6을 기반으로 지원하지 않으며 모듈의 경로를 지정해야합니다.
그래서 나는 당신 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);
그리고 함수에 대한 모든 참조를 적절히 처리하십시오.
답변
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 모듈에 대한 업데이트
답변
여기에 답변이 아니며 의견과 비슷합니다. 죄송하지만 의견을 말할 수 없습니다.
노드 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')}
}
답변
새로운 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');