每天一篇文章来记录记录自己的成长吧。大二,该静心了。加油~

好了,废话不多说,今天说说nodejs中的模块化.(注:此文为自己对书nodejs实战的总结)

nodejs一个重要的特性就是模块化,模块就是node.js对常用功能进行分组的方式。而且,node无需真正辨别模块到底是我们自己编写的还是从外部仓库中获取的。这样我们只需要一个额外的json文档和一两行代码,我们就能引用别人的代码或者别人引用我们的代码,是不是很酷~。

好,下面我们来编写一个简单的模块:

exports.hello_world = function(){

console.log("Hello World");

}

我们用mymodule.js文件来保存这段代码,exports对象是一个特殊的对象,在每个我们创建的文件中由Node的文件系统创建,当我们引用这个模块时,会作为require函数的值返回。它被封装在每个模块的module对象中,用来暴露函数,变量或类。使用模块的方法也很简单,代码如下:

var mm = require('./mymodule');

mm.hello_world();

这样我们可以通过exports对象来暴露任何我们想要暴露的函数和类。当我们频繁的从模块中返回对象时,我们会有两种使用的核心模式:

第一种就是我们的工厂模式,看下面一段代码:

functionHello(lang){this.language =lang;this.greet() = function(){switch(this.language){case "en" :return "Hello1";break;case "de" :return "Hello2";break;case "jp" :return "Hello3";break;default:return "No speaka that language";break;

}

}

}//现在我们用工厂模式来返回我们Hello类的实例

exports.create_Hello = function(lang){return newHello(lang);

}

View Code

这种模式的有点事模块可以通过exports对象来暴露其他的函数和类。

第二种模式就是构造函数模式,即直接模式,现在我们函数不变,用构造函数代码就应是这样:

module.exports = Hello;

注意我们在使用的时候就应该把代码变一下:

var hello = require("./mymodule");var lang = "en";var obj = newhello(lang);

obj.greet();

但记住在这里我们真正唯一暴露的是一个类的构造函数。这和我们面向对象的思想很接近,但是有个缺点就是我们不能让模块暴露更多的东西。所以我们经常会用的是我们的工厂模式。

我们知道了想要在一个文件中引入模块我们只需使用require函数即可,注意我们引入的模块对于引入他们的模块时私有的。如果a.js加载http模块,那么b.js是无法加载这个模块的,除非b也引入了http模块。

下面看看Node.js是怎样来查找模块的,其实规则很简单:

1.当请求的是内置模块(如http和fs)时,node会直接使用这些模块

2.当请求的模块一路径符(如./  ../  /)开始时,node会找到指定的目录并且加载他,如果没有在模块名中指定.js扩展名,那么node会首先查找基于同名文件夹的模块,如果没有找到,那么他会添加扩展名.js .json和.node,并尝试一次加载这些模块(带node扩展名的模块会被编译成附加模块)

3.如果没有路径符,node会在当前文件夹的node_modules/子文件夹下查找模块。如果找到,则加载该模块,否则,node会以自己的方式在当前位置的路径树下寻找mode_modules/文件夹,如果还失败,那么他会在一些默认的地址下进行搜寻,如/usr/lib和/usr/local/lib文件夹.

4.如果还没找到就抛出错误.

以前我们在引用文件时很容易进入引用文件死循环,但是在node中却不会这样。比如我在a.js中引入b.js,在b.js中引入a.js,在main.js中引入a.js,这个在node 中的执行顺序是先加载main.js,然后运行 引入a.js,再引入b.js,然后node会检测到循环并返回一个指向a.js的对象,但是不会再执行此代码。

我们知道node.js的每个文件都是一个含有module和exports对象的模块,这个模块也可以很复杂:包含一个目录用来保存模块的内容和一个包含包信息的文件。如果我们想要编写一系列的支持文件,并将模块的功能拆散到多个js文件中,甚至包含单元测试,那么我们可以这么来写:

1.创建一个文件夹来存放模块的内容

2.添加一个名为package.json的文件到文件夹中。文件至少包含当前模块的名字和一个主要的JS文件(用来一开始加载该模块)

3.如果Node没有找到package.json文件或者没有指定主JS文件,那他就会查找index.js(或者是编译后的附加模块index.node)

当然模块的内容不止这么一点点,剩下的以后再补充吧。

node mysql 模块化_Node.js中的模块化相关推荐

  1. node mysql 查询_Node.js使用mysql进行查询详解

    本篇教程介绍了Node.js使用mysql进行查询详解,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入. < 因为返回的是个对象 var selectSql1=&quo ...

  2. thymeleaf加载不了js引用_web前端教程之js中的模块化一

    web前端教程之js中的模块化一:我们知道最常见的模块化方案有CommonJS.AMD.CMD.ES6,AMD规范一般用于浏览器,异步的,因为模块加载是异步的,js解释是同步的,所以有时候导致依赖还没 ...

  3. 引入js_好程序员web前端教程分享js中的模块化一

    好程序员web前端教程分享js中的模块化一:我们知道最常见的模块化方案有CommonJS.AMD.CMD.ES6,AMD规范一般用于浏览器,异步的,因为模块加载是异步的,js解释是同步的,所以有时候导 ...

  4. 好程序员web前端教程分享js中的模块化一

    好程序员web前端教程分享js中的模块化一:我们知道最常见的模块化方案有CommonJS.AMD.CMD.ES6,AMD规范一般用于浏览器,异步的,因为模块加载是异步的,js解释是同步的,所以有时候导 ...

  5. 深圳Web前端学习:js中的模块化--【千锋】

    深圳Web前端学习:js中的模块化–[千锋] 0.前言 我们知道最常见的模块化方案有CommonJS.AMD.CMD.ES6,AMD规范一般用于浏览器,异步的,因为模块加载是异步的,js解释是同步的, ...

  6. node mysql 模块化_Node.js 模块系统

    Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node. ...

  7. win7 能下node什么版本_Node.js 版本知多少?又该如何选择?

    习惯成自然是个魔术师.它对美丽的东西是残酷的,但是对丑陋的东西却是仁慈的.--威达 Node.js 曾出现过与 io.js 的分裂,自合并成立 Node.js 基金会以来,就开始使用 Long Ter ...

  8. js 拉勾网效果_Node.js 中实践基于 Redis 的分布式锁实现

    在一些分布式环境下.多线程并发编程中,如果对同一资源进行读写操作,避免不了的一个就是资源竞争问题,通过引入分布式锁这一概念,可以解决数据一致性问题. 作者简介:五月君,Nodejs Developer ...

  9. 修改器内置脚本编写_Node.js 中实践 Redis Lua 脚本

    对别人的意见要表示尊重.千万别说:"你错了."--卡耐基 Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提 ...

最新文章

  1. 线程同步工具(七)在并发任务间交换数据
  2. 如何处理网络丢包故障?—Vecloud微云
  3. 汇编OFFSET,SEG,LEA
  4. 【深度学习】陶大程等人编写!最新41页深度学习理论综述
  5. ibus无法出现选择框如何解决
  6. SQL函数获取一年中每个月的天数
  7. [html] html5都有哪些新的特性?移除了哪些元素?
  8. 关于linux系统中无法识别某一命令问题的解决方案
  9. update关联一个视图的时候特别慢_实现一个简单的Vue.js
  10. LeetCode003-无重复字符的最长子串(Length of longest substring)-Rust语言实现
  11. java protobuf extend_如何使用protobuf extend和编写protobuf插件
  12. webuploader
  13. .Net framework 3.5缺失解决
  14. MIPS指令 MIPS架构
  15. 【vconsole】vconsole网页调试
  16. 健身和计算机未来哪个好,健身教练未来的发展前景原来这么好,你知道吗?
  17. 在Javascript 中的Base64加密,支持中文加密及emoji表情的unicode编码的base64加密
  18. You can't specify target table 'sys_user_function' for update in FROM clause
  19. 何为五笔输入的最高境界?
  20. Linux后处理软件,FieldView(CFD后处理软件)

热门文章

  1. Codeforces 405D 数学问题
  2. 惊恐的市场洗牌网游市场诞生危机论
  3. TOMCAT启动汉字乱码解决方案
  4. Netty 5 io.netty.util.IllegalReferenceCountException 异常
  5. 【推荐实践】爱奇艺推荐中台探索与实践
  6. 【报告分享】2021新茶饮研究报告.pdf(附下载链接)
  7. 【实践】多业务建模在美团搜索排序中的实践
  8. 【白皮书分享】2021内容营销白皮书.pdf(附下载链接)
  9. python深度学习第三讲——用python写神经网络梯度下降(手写字符识别mnist)
  10. 对比学习在NLP和多模态领域的应用