浅谈NodeJs的板块机制

作者 : 开心源码 本文共2495个字,预计阅读时间需要7分钟 发布时间: 2022-05-11 共60人阅读

写在前面

昨晚从箱子中翻出来了朴大的《深入浅出nodeJs》,看了两章,顿时醍醐灌顶!啊!原来是这样!怪不得!顿时觉也不睡了,翻身起来写了点笔记。生怕第二天就忘了~不知道为什么,我研究问题喜欢追求根源,比方node。也许是我真的酷爱前台吧!书读的多了,问题处理的多了,就会感觉自己的知识任脉被逐一打通,脉络越来越清晰!神清气爽有木有!
这篇文章主要是记录少量关于node的板块机制。

历史

我们都知道,js在刚被创立的时候,只是为了在网页上写少量小脚本而已,比方网页特效,表单验证等等,创建者也许没觉悟到以后的js会发展到如此规模。这是web1.0时代。
在web 2.0时代,各种前台库,前台框架被开发出来,jquery,angular就是代表。此时js的功可以也就从写写小特效啥的跃迁到了应使用开发的级别上。能说,js经历了工具类库,组件库,前台框架,前台应使用的变迁。
于是在越来越广泛的应使用中,js暴露了它先天就缺乏的一项功可以:板块。在其它高级语言,都有板块的定义,java有类,python有import机制,ruby有require,php有require和include。而js此时还单纯的使用script标签引入,使用命名空间来束缚代码,杂乱无章,于是,commonjs规范便应运而出。

commonJS的板块规范

commonjs规范的出发点就是让js在任何地方都可以运行。它弥补了js此时的几点缺陷:

  • 没有板块概念
  • 标准库较少
  • 没有标准接口
  • 没有包管理系统

当然,如今commonjs规范已经处理了大部分问题,而且涵盖了板块,二进制,Buffer,字符集编码,I/O流,单元测试,web服务网关接口,包管理,等。

commonjs对板块的定义很简单,包含了板块定义,板块引使用,板块标识3个部分。

  1. 板块引使用
var xx = require('xxx')

关键字require来接受板块标识,引入这个板块的API到上下文中。

  1. 板块定义

一个例子来解释:

//add.jsfunction add(a,b){  return a+b;}// 这样导出的 add是作为 exports 的一个方法被导出的exports.add = add;// main.jsvar Add = require('add');console.log(Add.add(1,2));//Add是require引入的板块名,add是方法名。

node在编译的时候,会把代码封装成如下的样子

// require 是对 Node.js 实现查找板块的 Module._load 实例的引使用// __finename 和 __dirname 是 Node.js 在查找该板块后找到的板块名称和板块绝对路径(function(exports,require,module,__filename,__dirname){  function add (a,b){    return a+b;  }  exports.add = add;})

为了将函数直接导出成一个板块,而不是一个方法,使用到了全局变量module,下面就是我们常见的样子了:

// add.jsfunction add (a,b){  return a+b ;}module.exports = add;// main.jsvar add = require('add');console.log(add(1,2));
  1. 板块标识

板块标识就是require()里的参数,必需是小驼峰命名的字符串,或者者是路径(./ 或者../)。能没有后缀.js

Node的板块机制

Node并不是完全按照commonjs规范来实现,而是进行了少量取舍,并添加了自己的少量特性。
Node中引入板块,经历3个步骤:

  • 路径分析
  • 文件定位
  • 编译执行

Node中板块分为2种,核心板块(Node提供的)和文件板块(使用户自己编写的)
Node对引入过的板块会进行缓存,就像前台浏览器会缓存静态脚原本提高性可以一样。require()方法在对同一板块的二次加载全部采使用缓存优先的方式。但是对核心板块的缓存检查优先于对文件板块的缓存检查。

  1. 路径分析

就是对板块标识的分析呗。
板块标识符在Node中分以下几类:

  • 核心板块,如http,path
  • ./ ../相对路径
  • / 绝对路径
  • 非路径形式的文件板块。
  1. 文件分析

假如板块标识符没有后缀,默认补上后缀从.js,.json,.node来次序查找。

  1. 板块编译

js编译上面已经提到了。Node对JS文件进行了包装,在头部增加了(function (exports, require, module, __filename, __dirname) {…})。这样每个板块都进行了作使用域隔离。包装之后通过vm原生板块的runInThisContext()方法执行(相似eval,只是具备明确上下文,不污染全局)返回一个function。而后将上述参数传给这个function执行。
json编译更简单,Node直接使用JSON.parse()方法编译json内容,得到的对象赋给exports。

包和NPM

commonjs的包规范包含2个组成部分,包结构和包形容文件
包形容文件:package.json
包结构:

  • package.json 包形容文件
  • bin: 存放可执行二进制文件的目录
  • lib 存放js代码的目录
  • doc. 存放文档的目录
  • test: 存放单元测试使用例的代码

NPM的使用法就不多说了。

前后台公使用板块

自从Node出来以后,js也能运使用在后台。但是前后台的JS扮演的角色不同,浏览器端的js需要经历从同一个服务器分发到多个用户端执行。服务端的js则是相同的代码屡次执行。前者的瓶颈在于带宽。后者的瓶颈在于CUP和内存。前者需要通过网络加载。后者从磁盘中加载。
由于Node基于commonjs规范来同步的加载板块的。前台若使用同步方式来加载板块,在使用户体验上会造成很大的问题。UI在初始化的时候需要等待很长时间来加载js脚本。所以提出了异步板块定义AMD和CMD。这在我的另一篇博客中有提到。就不多说了。

为了写个可以兼容前后台的板块规范,类库的开发者要把代码包装在一个 闭包里。这样就可以兼容Node,AMD,CMD和常见的浏览器。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 浅谈NodeJs的板块机制

发表回复