태그 보관물: typescript

typescript

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

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

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

import express from "express";

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

const express = require("express");

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



답변

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

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

그 외에도,

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

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


답변

가장 큰 차이점 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);

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


답변

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')}
}

참조 1-Nodejs Doc

참조 2-github 문제


답변

새로운 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');


답변