Node.js之模块机制

更新日期: 2019-09-21阅读: 1.6k标签: 机制

其实在JavaScript的发展中,它主要是在浏览器前端中被应用广泛。因为在实际应用中, JavaScript的表现能力主要取决于宿主环境的api支持程度, 在最早期,只有对BOM, dom的支持,随着html5的出现,在浏览器中出现了更多,更强大的API供JavaScript调用,但是这些都是发生在前端,后端JavaScript的规范却远远落后。Java有class文件,Phthon有import机制,php有include和require,但是JavaScript通过script标签引入代码的方式显得杂乱无章,为我们的后期维护增加了难度。对于JavaScript来说,还有四大主要缺点:

1.没有模块系统。 
2.标准库比较少。 
3.没有标准,统一的接口。 
4.缺乏包管理系统。

Node.js实现了一套非常易用的模块系统,而Node的包管理系统npm对包规范的完好支持使得Node应用在开发过程事半功倍。这一篇文章,主要针对Node的模块以及包的实现进行说明。


Node的模块规范

其实模块的定义非常简单,主要分为模块引用,模块定义和模块标识三个部分。

1)模块引用

Node.js中存在require()方法,这个方法接受模块标识,以此引入一个模块的API到当前的上下文中。

2)模块定义

既然我们可以用require()来引入模块,那自然也可以引出模块。Node.js提供了exports对象用于导出当前模块的方法和变量,并且exports是唯一导出的出口。在每个模块中,存在一个module对象,表示模块本身,exports其实就是module的一个属性。在Node.js中,一个文件其实就是一个模块,将我们需要导出的方法和属性绑定在exports对象上作为属性就可以将该方法或属性导出。

在另一个模块,可以通过require()引入模块,就可以使用导出的方法sum()。

3)模块标识

模块标识其实传递给require()方法的参数,模块标识必须是符合驼峰命名的字符串或者以./,../开头的路径,引入模块模块标识可以省略.js后缀。

模块的好处是将特定的方法和变量限定在特定的作用域中,使得开发者完全不必去考虑变量污染的问题。


Node.js的模块实现

在Node.js中,有三类模块,其中一类是Node.js提供的核心模块,就比如上一篇说过的fs文件模块,database数据库模块,还有一类是开发者自行编写的文件模块,就比如刚才示例的test.js模块,第三类就是自定义模块,这是一种特殊的文件模块,一般是一个文件或包的形式,比如引入mysql所需的jar包。

在Node.js中引入模块,需要经历三步:

(1)路径分析

对于文件模块来说,引入时模块标识指明了确切的文件位置,所以在路径分析中可以省略大量时间,加载速度仅次于核心模块。

自定义模块则是会从项目根目录逐个比较路径,直到找到目标模块为止。所以,自定义模块的路径越深,路径分析的耗时越多,所以自定义模块的加载速度是最慢的。

(2)文件定位

刚才其实说过了,模块标识可以不包含后缀名,所以Node.js在文件定位时会依次补充.js,.json,.node后缀名,然后去进行文件定位,因为Node.js是单线程,所以文件定位时会发生堵塞,所以如果引入的模块后缀是.json或者.node,可以在引入的时候加上后缀,可以提高查找速度。

(3)编译执行

定义到具体文件后,Node.js会创建一个模块对象,然后将模块引入并且编译。每一个编译成功的模块其文件路径都会作为索引缓存在缓存对象上,以提高二次引入模块的性能。

核心模块在Node.js源代码的编译过程中,直接被编译成二进制文件,然后被直接加载到内存中,所以核心模块引入时,文件定位和编译执行这两个步骤可以直接跳过,并且核心模块在路径分析中会被优先判断,所以核心模块的加载速度是最快的。

文件模块则是在执行时动态加载,所以路径分析,文件定位以及编译执行这三个步骤都不可省略,所以加载速度比核心模块慢。

Node.js对引入过的模块会进行缓存,以减少二次引入模块的性能开销二次加载模块一律采用缓存优先方式。核心模块的缓存检查优先于文件模块。


包管理工具NPM

刚才说到Node模块,但是虽然我们可以引用模块,但是模块与模块之间仍然是散列在各地的,相互之间并不能直接引用。而Node的包管理工具NPM则将模块相互联系起来。包其实是在模块的基础上进一步组织JavaScript代码。

其实NPM会有一个包描述文件package.json,一般位于包的根目录, NPM的所有行为都与包描述文件息息相关。前面几篇有讲过NPM作为默认包管理工具,会作为Node环境被一起安装。

NPM常用功能

NPM帮助Node完成了第三方模块的发布,安装和依赖。因为有NPM的存在,Node和第三方模块之间形成了很好的一个生态系统,而且逐渐越来越强大。接下来大致讲解下几个NPM常见命令

  • npm --version 查看当前NPM的版本

  • npm 查看帮助说明

  • npm help 查看具体命令说明

  • 执行命令会在浏览器中打开对应命令的说明文档

  • npm install 安装依赖包,默认使用–-save参数,即默认添加到package.json中

  • 执行该命令,NPM会在当前目录创建node_modules目录,然后再node_modules创建对应依赖包的目录,然后将依赖包解压到该目录。

  • npm init 在此目录初始化生成package.json文件

  • npm uninstall 卸载依赖包, 默认使用-–save参数,即从package.json中移除

  • npm ls查看当前目录的依赖包

  • npm root -g 查看全局安装地址

  • npm list 查看依赖的当前版本

NPM存在的问题

在NPM平台,每个人都可以分享包,所以包质量没有办法保证,而且Node.js运行在服务端,所以需要考虑安全问题。所以一个优秀的模块需要符合几大模块:

  1. 具备良好的测试

  2. 具备良好的文档

  3. 具备良好的测试覆盖率

  4. 具备良好的代码规范

今天内容就到这里了,其实这篇文章并没有涉及到代码的编写,而是从模块的角度去理解Node.js,Node.js通过模块规范,弥补了JavaSCript没有结构性的不足,而NPM通过对包的统一管理,使得项目开发中的依赖问题得到有效解决。

文章原创于公众号:程序猿周先森 
来自:https://www.cnblogs.com/niyueling/p/11562990.html 

链接: https://www.fly63.com/article/detial/5439

浅析前端页面渲染机制

作为一个前端开发,最常见的运行环境应该是浏览器吧,为了更好的通过浏览器把优秀的产品带给用户,也为了更好的发展自己的前端职业之路,有必要了解从我们在浏览器地址栏输入网址到看到页面这期间浏览器是如何进行工作的

这一次,彻底弄懂 JavaScript 执行机制

javascript是一门单线程语言,Event Loop是javascript的执行机制.牢牢把握两个基本点,以认真学习javascript为中心,早日实现成为前端高手的伟大梦想!

创建js hook钩子_js中的钩子机制与实现

钩子机制也叫hook机制,或者你可以把它理解成一种匹配机制,就是我们在代码中设置一些钩子,然后程序执行时自动去匹配这些钩子;这样做的好处就是提高了程序的执行效率,减少了if else 的使用同事优化代码结构

小程序的更新机制_如何实现强制更新?

在讲小程序的更新机制之前,我们需要先了解小程序的2种启动模式,分别为:冷启动和热启动。小程序不同的启动方式,对应的更新情况不不一样的。无论冷启动,还是热启动。小程序都不会马上更新的,如果我们需要强制更新,需要如何实现呢?

基于JWT的Token认证机制实现及安全问题

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。其JWT的组成:一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。

web前端-JavaScript的运行机制

本文介绍JavaScript运行机制,JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。

轮询机制解决后端任务回调问题

现在有一个需求,前端有一个按钮,点击以后会调用后端一个接口,这个接口会根据用户的筛选条件去hadoop上跑任务,将图片的base64转为img然后打包成zip,生成一个下载连接返回给前端,弹出下载框。hadoop上的这个任务耗时比较久

JavaScript预解释是一种毫无节操的机制

js代码执行之前,浏览器首先会默认的把所有带var和function的进行提前的声明或者定义:1.理解声明和定义、2.对于带var和function关键字的在预解释的时候操作不一样的、3.预解释只发生在当前的作用域下

js对代码解析机制

脚本执行js引擎都做了什么呢?1.语法分析 2.预编译 3.解释执行。在执行代码前,还有两个步骤;语法分析很简单,就是引擎检查你的代码有没有什么低级的语法错误 ,查找全局变量声明(包括隐式全局变量声明,省略var声明),变量名作全局对象的属性,值为undefined

web认证机制

以前对认证这方面的认识一直不太深刻,不清楚为什么需要token这种认证,为什么不简单使用session存储用户登录信息等。最近读了几篇大牛的博客才对认证机制方面有了进一步了解。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!