首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

前端科普系列(3):CommonJS 不是前端却革命了前端

一、前言 上一篇《前端科普系列(2):Node.js 换个角度看世界》,我们聊了 Node.js 相关的东西,Node.js 能在诞生后火到如此一塌糊涂,离不开它成熟的模块化实现,Node.js 的模块化是在...// a.js var name = 'morrain' var age = 18 上面代码中,a.jsNode.js 应用中的一个模块,里面申明的变量 name 和 age 是 a.js 私有的...你可以理解为 Node.js 在每个模块开始的地方,添加了如下这行代码。...原因主要有两个,一个是因为 Node.js 本身也不是完全采用 CommonJS 的规范,譬如在CommonJS 之 exports 中的提到 exports 属性就是 Node.js 自己加的,Node.js...前面提到的 Node.js 已经默认支持 ES6 Module ,浏览器也已经全面支持 ES6 Module。至于 Node.js 和 浏览器 如何使用 ES6 Module,可以自行学习。

60210

前端科普系列(3):CommonJS 不是前端却革命了前端

换个角度看世界》,我们聊了 Node.js 相关的东西,Node.js 能在诞生后火到如此一塌糊涂,离不开它成熟的模块化实现,Node.js 的模块化是在 CommonJS 规范的基础上实现的。...// a.js var name = 'morrain' var age = 18 上面代码中,a.jsNode.js 应用中的一个模块,里面申明的变量 name 和 age 是 a.js 私有的...事实也是如些,早在2013年5月,Node.js 的包管理器 NPM 的作者 Isaac Z. Schlueter 说过 CommonJS 已经过时,Node.js 的内核开发者已经决定废弃该规范。...原因主要有两个,一个是因为 Node.js 本身也不是完全采用 CommonJS 的规范,譬如在CommonJS 之 exports 中的提到 exports 属性就是 Node.js 自己加的,Node.js...前面提到的 Node.js 已经默认支持 ES6 Module ,浏览器也已经全面支持 ES6 Module。至于 Node.js 和 浏览器 如何使用 ES6 Module,可以自行学习。

1K40
您找到你想要的搜索结果了吗?
是的
没有找到

浅谈 Node.js 模块机制及常见面试问题解答

,参考:模块加载机制 module.exports与exports的区别,参考:对象引用关系考察 假设有a.js、b.js两个模块相互引用,会有什么问题?是否为陷入死循环?...模块循环引用 问题1 假设有 a.js、b.js 两个模块相互引用,会有什么问题?是否为陷入死循环?...看以下例子 // a.js console.log('a模块start'); exports.test = 1; undeclaredVariable = 'a模块未声明变量' const b =...控制台执行 node a.js,查看输出结果: a模块start b模块start undeclaredVariable: a模块未声明变量 b模块加载完毕: a.test值: 1 a模块加载完毕:...b.test值: 2 问题1,启动 a.js 的时候,会加载 b.js,那么在 b.js 中又加载了 a.js,但是此时 a.js 模块还没有执行完,返回的是一个 a.js 模块的 exports 对象

1.4K20

CommonJS、ES6模块加载机制详解

Node加载 概述 Node对ES6模块的处理比较麻烦,因为它有自己的CommonJS模块格式,与ES6模块格式是不兼容的。...让我们来看一下Node官方文档(nodejs.org/api/modules.html#modules_cycles)里面的例子。脚本文件a.js代码如下。...``` $ node main.js ``` ``` 在 b.js 之中,a.done = false b.js 执行完毕 在 a.js 之中,b.done = true a.js 执行完毕 在...执行a.js,结果如下。 ``` $ babel-node a.js b.js undefined a.js Bar ``` 上面的代码中,由于a.js的第一行是加载b.js,所以先执行的是b.js。...``` $ babel-node a.js foo bar 执行完毕 // 执行结果也有可能是 foo bar foo bar 执行完毕 执行完毕 ``` 上面的代码中,a.js之所以能够执行,原因就在于

1.9K61

浅谈 Node.js 模块机制及常见面试问题解答

,参考:模块加载机制 module.exports与exports的区别,参考:对象引用关系考察 假设有a.js、b.js两个模块相互引用,会有什么问题?是否为陷入死循环?...模块循环引用 问题1 假设有 a.js、b.js 两个模块相互引用,会有什么问题?是否为陷入死循环?...控制台执行 node a.js,查看输出结果: a模块startb模块startundeclaredVariable: a模块未声明变量b模块加载完毕: a.test值: 1a模块加载完毕: b.test...值: 2 问题1,启动 a.js 的时候,会加载 b.js,那么在 b.js 中又加载了 a.js,但是此时 a.js 模块还没有执行完,返回的是一个 a.js 模块的 exports 对象 未完成的副本...然后 b.js 完成加载之后将 exports 对象提供给了 a.js 模块 问题2,因为 undeclaredVariable 是一个未声明的变量,也就是一个挂在全局的变量,那么在其他地方当然是可以拿到的

73220

require时,exports和module.exports的区别你真的懂吗?

大家哦读知道 Node.js 遵循 CommonJS 规范,使用 require 关键字来加载模块。...因为在 C++ 中通常使用#IFNDEF等关键字来避免文件的重复引入,但是在 Node.js 中无需关心这一点,因为 Node.js 默认先从缓存中加载模块,一个模块被加载一次之后,就会在缓存中维持一个副本...require() 的缓存策略 Node.js 会自动缓存经过 require 引入的文件,使得下次再引入不需要经过文件系统而是直接从缓存中读取。...使用的一点建议 建议:在使用的时候更建议大家使用module.exports(根据下面的例子也能得出) Node.js 认为每个文件都是一个独立的模块。...如果你的包有两个文件,假设是“a.js” 和“b.js”,然后“b.js” 要使用“a.js” 的功能,“a.js” 必须要通过给 exports 对象增加属性来暴露这些功能: // a.js exports.verifyPassword

1.6K20

nodejs探秘:require加载模块的原理及代码实现

,查找node_module目录,然后进去查找,如果没有node_module目录,则继续 往上一级目录执行,直到根目录为止。...因为它会先从加载代码所在路径的node_module目录开始查找,假设我们应用有如下目录: myAPP |--- foo.js |---node_modules |----depA...假设我们的代码模块之间存在如下循环依赖: 我们先创建a.js和b.js,a.js的内容如下: exports.loaded = false const b = my_require('..../a.js’),在执行时首先会把a.js对应的module对象进行缓存,对应的语句如下: my_require.cache[id] = module 这个缓存是代码没有产生死循环的原因。...然后执行LoadModule,这个函数会执行a.js中的代码,在a.js代码中,第一行为: exports.load = false 这句话执行后会使得它对应的module变为module.exports.load

82710

「万字进阶」深入浅出 Commonjs 和 Es Module

如果没有,在父级目录的 node_modules 查找,如果没有在父级目录的父级目录的 node_modules 中查找。 沿着路径向上递归,直到根目录下的 node_modules 目录。...在查找过程中,会找 package.json 下 main 属性指向的文件,如果没有 package.json ,在 node 环境下会以此查找 index.js ,index.json ,index.node.../b') console.log('node 入口文件') 接下来终端输入 node main.js 运行 main.js,效果如下: 5.jpg 从上面的运行结果可以得出以下结论: main.js...① 首先执行 node main.js ,那么开始执行第一行 require(a.js); ② 那么首先判断 a.js 有没有缓存,因为没有缓存,先加入缓存,然后执行文件 a.js (需要注意 是先加入缓存...⑦ 最后回到 main.js,打印 console.log('node 入口文件') 完成这个流程。

3.2K31
领券