ES6 Module和CommonJS模块的区别:
CommonJS是对模块的浅拷贝,ES6 Module是对模块的引用,即ES6 Module只存只读,不能改变其值,具体点就是指针指向不能变,类似const
import的接口是read-only(只读状态),不能修改其变量值。 即不能修改其变量的指针指向,但可以改变变量内部指针指向,可以对commonJS对重新赋值(改变指针指向),
但是对ES6 Module赋值会编译报错。
1<script type="text/javascript"> 2 // CommonJS是对模块的浅拷贝 3 // lib.js 4 var counter = 3; 5 function incCounter() { 6 counter++; 7 } 8 module.exports = { 9 counter: counter, 10 incCounter: incCounter 11 }; 12 // main.js 13 var mod = require('./lib'); 14 15 console.log(mod.counter); // 3 16 mod.incCounter(); 17 console.log(mod.counter); // 3 18 </script> 19 <script type="text/javascript"> 20 // ES6 Module是对模块的引用 21 // lib.js 22 export let counter = 3; 23 export function incCounter() { 24 counter++; 25 } 26 27 // main.js 28 import { counter, incCounter } from './lib'; 29 console.log(counter); // 3 30 incCounter(); 31 console.log(counter); // 4 32 </script> 33 <script type="text/javascript"> 34 // m1.js 35 export var foo = 'bar'; 36 setTimeout(() => foo = 'baz', 500); 37 38 // m2.js 39 import {foo} from './m1.js'; 40 console.log(foo); //bar 41 setTimeout(() => console.log(foo), 500); //baz 42 </script>
ES6 Module和CommonJS模块的共同点:
CommonJS和ES6 Module都不可以对引入的对象进行赋值,即对对象内部属性的值进行改变。
但是可以添加属性
1<script type="text/javascript"> 2 // lib.js 3 export let obj = {}; 4 5 // main.js 6 import { obj } from './lib'; 7 8 obj.prop = 123; // OK 9 obj = {}; // TypeError 10 </script>