ES6和CommonJS都有自己的一套处理模块化代码的措施,即JS文件之间的相互引用。
为了方便两种方式的测试,使用nodejs的环境进行测试
CommonJS的模块处理
使用require来引入其他模块的代码,使用module.exports来引出
// exportDemo.js count = 1; module.exports.count = count; module.exports.Hello = function() { var name; this.setName = function(newName) { name = newName; } this.sayHello = function() { console.log("hello Mr." + name); } this.getId = function() { return count++ } }
// requireDemo.js var {Hello} = require("./exportDemo") var hello = new Hello(); hello.setName("Blank"); hello.sayHello();
在终端执行 node requireDemo.js
,返回结果为'hello Mr.Blank'
导出的Hello函数是原函数的一次拷贝,修改Hello函数的属性值不会对其他require的地方造成影响
var { Hello, count } = require('./exportDemo') var hello = new Hello(); // 让count自增 console.log(hello.getId()); console.log(hello.getId()); // 发现获取的count还是原值 console.log(count) // 真正的count其实是已经改了的 var newHello = new Hello(); console.log(newHello.getId()) var { Hello: newHello, count: newCount } = require('./exportDemo') console.log(newCount, 'newCount'); // 再次require,取得的newHello和之前require的Hello指向同一个拷贝 console.log(newHello === Hello)
ES6的模块处理
nodejs中运行ES6风格的代码
nodejs默认是不支持ES6的模块处理方案的。
但是在8.5.0之后,ES6代码的文件格式定为mjs后,可使用 node --experimental-modules xxx.mjs
运行。
// exportDemo.mjs export let a = 1;
// importDemo.mjs import {a} from './exportDemo.mjs' console.log(a)
与CommonJS模块处理的区别
CommonJS 模块输出的是一个值的拷贝(已在上一章验证),ES6 模块输出的是值的引用。
// exportDemo.mjs export let counter = 1; export function incCounter() { counter ++; }
// importDemo.mjs import { counter, incCounter } from './exportDemo.mjs' incCounter(); console.log(counter) // 打印结果为2,而不是初始值的1
CommonJS模块是运行时加载,ES6模块是编译时输出接口
Nodejs此类的运行环境会在一个闭包中运行CommonJS模块代码
(function(exports, require, module, __filename, __dirname) { // Module code actually lives in here });
ES6 模块不会缓存运行结果,而是动态地去被加载的模块取值,并且变量总是绑定其所在的模块。
// exportDemo.mjs export let a = 1; export const b = 2; export let obj = {}; // importDemo.mjs import { a, b } from './exportDemo.mjs' console.log(a, b) a = 1 // 报错,TypeError: Assignment to constant variable,export出来的值是一个只读引用 obj.x = 1 // 可以改变属性值
在ES6模块中我们更多地要去考虑语法的问题 export default
有时候我们会在代码发现 export default obj
的用法,那么这个default是用来干嘛的"htmlcode">
export { x: 1 } // 报错,SyntaxError:Unexpected token,这是一个编译阶段的错误 // 正确写法 export default { x: 1 }
export匿名函数
export function() {} // 报错,SyntaxError: Unexpected token ( // 正确写法 export default function() {}
循环引用(recycling loading)
在复杂的模块中,可能会出现模块间的 互相引用 。
commonJS的循环引用运行机制
// a.js exports.loaded = false; var b = require('./b.js') console.log("b in a is " + JSON.stringify(b)) exports.loaded = true; console.log("a complete")
// b.js exports.loaded = false; var a = require('./a.js') console.log("a in b is " + JSON.stringify(a)) exports.loaded = true; console.log("b complete")
// main.js var a = require('./a.js') var b = require('./b.js') console.log("a in main is" + JSON.stringify(a)) console.log("b in main is" + JSON.stringify(b))
执行指令 nodejs main.js
时序图下的执行步骤分解图如下所示:
ES6的循环引用运行机制
一个会报错的例子
// a.mjs import { bar } from './b.mjs' console.log(bar); export let foo = 'foo from a.mjs'
// b.mjs import { foo } from './a.mjs' console.log(foo) export let bar = 'bar from b.mjs'
// main.mjs import { foo } from './a.mjs' import { bar } from './b.mjs'
node main.mjs
时序图下的执行步骤分解图如下所示:
ES6的循环引用要特别注意变量是否已被声明,若未被声明的块级作用域变量被其他模块引用时,会报错。
改进方案:循环引用中尽量去export可以提前确定的值(例如函数),其实我们总是希望去 引用模块执行完全后最终确定的变量 。
// a.mjs import { bar } from './b.mjs' console.log(bar()); export function foo() { return 'foo from a.mjs' }
// b.mjs import { foo } from './a.mjs' console.log(foo()); export function bar() { return 'bar from b.mjs' }
// main.mjs import { foo } from './a.mjs' import { bar } from './b.mjs'
node main.mjs
返回结果:
foo from a.mjs
bar from b.mjs
时序图下的执行步骤分解图如下所示:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]