require/exportとimport/exportは何が違いますか?
3236 ワード
歴史的背景 require/exports は野生規範の中から来ています.すなわち、これらの規範はJavaScriptコミュニティの開発者が自ら立案した規則であり、みんなの承認と幅広い応用を得ています.例えば、 は、 import/export ES 6からの新しい仕様、すなわちTC 39によって制定された新しいECMAScriptバージョン. 違い
書き方の違い
require/exports
require/exports
require/exports
require/exports
import/export
CommonJS
、AMD
、CMD
などです.Node
はCommonJS
の仕様に従い、requireJS
はAMD
に従い、seaJS
はCMD
に従う.Node
が直接的にES6
文法に適合することができないため、現段階require/exports
は依然として必要であり、必須である.babel
が誕生した後、まだ宿主環境(各ブラウザ、Node
)によって直接サポートされていないES6
文法をES5
にコンパイルすることができ、ES6 Module
のimport/export
をCommonJS
のrequire/exports
にコンパイルすることができる.書き方の違い
require/exports
/* */
exports.fs = fs; // ,
module.exports = fs; // ,
/* */
const fs = require('fs'); //
import/export/* */
export default fs; //
export const fs; //
export function readFile; //
export { readFile, read }; //
export * from 'fs'; //
/* */
import fs from 'fs'; //
import '/fs.js'; //
import * as fs from 'fs'; //
import { readFile } from 'fs'; // readFile
import { readFile as read } from 'fs'; // read , readFile
import fs , { readFile } from 'fs'; // readFile
出力の違いrequire/exports
require/exports
が出力したのは値のコピーです.つまり、値を導入すると、モジュール内部の変化はこの値に影響しません.// test.js
let num = 0;
function addNum(){
num++;
};
module.exports = {
num: num,
addNum: addNum
}
// main.js
const test = require('./test.js');
console.log(test.num); // output: 0
test.addNum();
console.log(test.num); // output: 0
import/exportimport/export
が出力したのは値のインデックスで、つまり、この参照は実は動的参照であり、キャッシュ値ではありません.モジュール内部が変化すると、あなたの導入値も更新されます.// test.js
export let num = 0;
export function addNum(){
num++;
};
// main.js
import { num, addNum } from './test.js';
console.log(num); // output: 0
addNum();
console.log(num); // output: 1
読み込みの違いrequire/exports
CommonJS
モジュールは、実行時にロードされます.CommonJS
モジュールがロードしているのはオブジェクトであるため、module.exports
属性であり、オブジェクトはスクリプトが実行されてから生成されるだけであり、これ以上コンパイルできない場合は「静的最適化」を行う.const { test1, test2, test3 } = require('test');
/* */
const _test = require('test'); // ,
const test1 = _test.test1;
const test2 = _test.test2;
const test3 = _test.test3;
import/exportES6
モジュールはコンパイル時出力インターフェースです.ES6
モジュールはオブジェクトではありません.外部インターフェースは静的な定義であり、コード静的な解析段階でしか生成されないので、効率はCommonJS
モジュールよりも高いです.import { test1, test2, test3 } from 'test'; // ,
非同期の差異require/exports
CommonJS
モジュールのrequire
は、同期ローディングモジュールである.import/export
ES6
モジュールのimport
コマンドは、非同期的にロードされ、独立したモジュール依存の解析段階がある.