技术控

    今日:120| 主题:49552
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] Node.js 模块系统

[复制链接]
欧豪呕霸 发表于 2016-10-15 15:14:21
58 0

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
在 node 中,我们使用    require('模块')的形式将一个模块引入到我们的当前的文件中来。关于    require路径的写法也有如下几种:  
  
       
  • 模块路径可以是一个以      /开头,表示一个      绝对路径   
  • 模块路径以      ./开头,表示当前目录出发的      相对路径   
  • 模块路径如果没有以      /或者      ./开头,那么这个模块要么是      核心模块要么是通过      npm安装在 node_modules 文件夹下的。  
  看到上面的不同路径写法, 我们就想起来在 web 中引入当前文件夹中的文件时是不需要加上    ./的, 但在 node 中使用    ./或    /开头的路径和不使用时,有着很大的差别。  
  模块的加载机制  

  
       
  • 首先按照加载的模块的文件名称进行查找   
  • 如果没有找到,则会在模块文件名称后加上      .js的后缀,进行查找   
  • 如果还没有找到,则会在文件名称后加上      .json的后缀,进行查找   
  • 如果还没有,则会在文件名称后加上      .node的后缀,进行查找   
  • 最终未找到,抛出异常  
  模块数据的使用  

    与浏览器中不同 , 在 node 中,每一个模块都有自己的作用域,在模块中使用 var 申明的变量的作用域范围是在该模块内,而不是 node 全局的。
    但是你忘记了使用 var 进行变量声明,恭喜你这时和浏览器中忘记使用的效果是一致的。该变量也将挂在全局对象上。
    只不过在      node中,全局对象是      global,而不是浏览器中的      window   
    下面看一个简单的例子:
  我们从两个文件    a.js和    b.js就可以简单的看到 node 的声明变量的作用域。  
  a.js:  
  1. vara ='这是a声明的变量';
  2. console.log('这是a.js模块');
复制代码
b.js:  
  1. require('./2.js');
  2. console.log('bbbb');
  3. console.log(a);
  4. console.log(global.a);
复制代码
     node b.js输出结果:  
  1. 这是2.js模块
  2. bbbb
  3. console.log(a);//ReferenceError: a is not defined
复制代码
至于去掉 var 之后会是怎么样,大家自己试试吧 ^ ^
  暴露模块API  

  module、module.exports、exports
  如同上面代码中所展示的,在 nodejs 中不能直接去拿到另一个模块中的变量函数等等。要让模块暴露一个API成为    require调用的返回值,我们就需要通过    module.exports或者    exports对外提供模块内部变量的访问。  
  默认情况下,每个模块都会暴露处一个空对象,如果你想要在该对象上添加属性,那么简单的使用    exports即可。  
  看这个例子:
  module_a.js:  
  1. console.log(exports ===module.exports)
  2. exports.name = 'module_a.js'
  3. exports.data = 'this is module_a.js data'
  4. exports.getDate = function(){
  5. returnnewDate();
  6. }
复制代码
module_b.js:  
  1. vara =require('./module_a.js')
  2. console.log(a.name)
  3. console.log(a.data)
  4. console.log(a.getDate())
复制代码
     node module_b.js输出:  
  1. true
  2. module_a.js
  3. this is module_a.js data
  4. Thu Sep 22 2016 22:23:59 GMT+0800 (CST)
复制代码
可以看到这里实际上在模块内部    exports就是对于    module.exports的引用,并且在使用    require引入模块之后,a 是一个对象。可见外部模块通过    require(模块)方法加载模块,该函数返回的就是被加载模块的    module.exports对象  
  如果这样在    module.exports对象上一个一个添加属性还满足不了你的需求,你还可以将    module.exports彻底重写。我们将上面的两个文件改写:  
  module_a.js:  
  1. module.exports =function(text){
  2. console.log('printf: '+ text);
  3. }
复制代码
module_b.js:  
  1. vara =require('./module_a.js')
  2. a('ok');
复制代码
     node module_b.js输出:    printf: ok  
  这样有一个需要注意的地方是:直接覆盖    exports或者    module.exports让模块导出一个值,这样做会破坏    exports和    module.exports的引用关系。  
  这是对于 node 的模块系统的学习,理解有限,如果有错误之处,请指出,谢谢!
  本文地址:    https://guowenfh.github.io/2016/10/15/node-module-system/
友荐云推荐




上一篇:cs.CL weekly 2016.10.10-2016.10.14
下一篇:Android Volley源码分析(一)
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表