1. 主页
  2. 发布
  3. 短网址二维码
  4. Base64编码解码
  5. 移动版blog
深入浅出Nodejs精简
作者:晨曦沐枫|发表时间:2018-8-25 15:02:22 |分类:nodejs

2.1: 模块机制

    2.1.1: commonJS规范

        commonjs规范是针对node同步加载 js 模块的能力,浏览器端对应能力的实现有 sea.js(CMD) 和 requirejs(AMD)

    2.1.2: 模块的引入和定义

        const http = require('http') // 引入

        exports 对象用于导出当前模块的方法或者变量,并且它是唯一导出的出口,而 exports 是 module 的属性。

        module.exports.msg = function() {} ; 或

        exports.msg = function() {} ; 

2.2: node模块的实现

    2.2.1: node模块分类

        node 中模块分为两类:一类是 node 提供的模块,称为核心模块(核心模块其实是由C/C++和Javascript编写的两部分组成,纯C/C++编写的那部分统一称为内建模块)。一类是用户编写的模块,称为文件模块。

        模块引入分为三步骤:路径分析,文件定位,编译执行

        两类模块的相同与不同:核心模块是C++编译好的二进制文件,在node进程启动时,核心模块就被直接加载到进程中;文件模块是运行时动态加载,需要完整的路径分析,文件定位,编译执行过程;相同点是都是优先从缓存中加载,即require()方法对相同模块的二次加载都是采用缓存优先策略。

    2.2.2: C/C++扩展模块

        新建一个 hello.cc 文件来编写 C/C++ 代码,并实现预定义的方法,为传入的目标对象添加预定义方法,调用 NODE_MODULE() 方法将注册方法定义到内存中去。因为不像编写内建模块那样将对象声明到 node_module_list 链表中,所以无法被认作是一个原生模块,只能通过 dlopen() 来动态加载,然后导出给 JavaScript 调用。

        通过 GYP 编译刚刚编写好的 hello.cc 扩展文件,这时我们需要写一个 node-gyp 的配置文件如:bindding.gyp,然后配置好自定义的名称 hello 指定好 source 的原路径即 hello.cc 文件路径,然后再指定编译对应的环境如 nix平台或者 windows 平台,编译命令 node-gyp configure && node-gyp build , 编译完成后会生成 hello.json 文件。

        项目中使用的时候 通过 const hello = require('./package/build/hello.node'); hello.test('扩展模块测试')

        require() 在引入 .node 文件的过程中,经历了两个步骤,第一个步骤是调用 uv_dlopen() 方法去打开动态链接库,第二个步骤是调用 uv_dlsym() 方法去找到动态链接库中通过 NODE_MODULE宏定义的方法地址。这两个过程都是通过 libuv 库进行封装的。在 *nix平台下实际上调用的是 dlfcn.h 头文件中定义的 dlopen() 和 dlsym() 两个方法;在windows平台则是通过 LoadLibraryExw() 和 GetProcAddress() 这两个方法实现的,它们分别加载 .so 和 .dll 文件(实际为 . node 文件),所以 libuv 帮助实现了 *nix 和 Windows 环境的跨平台。

        优势对比:C/C++扩展模块与JavaScript 模块的区别在于加载之后不需要编译,直接执行之后就可以被外部调用了,其加载速度比 JavaScript 模块略快,C/C++扩展模块好处在于可以更灵活和动态的加载它们,保持 node 模块自身简单性的同时,给予 Node 无限的可扩展性。


2.6: npm 包

    2.6.1 全局安装

        全局安装 -g 仅仅是将一个包安装为全局可用的可执行命令。它根据包描述文件中的 bin 字段配置,将实际脚本链接到与 Node 可执行文件相同的路径下:

        "bin" : {

            "express" : "./bin/express"

        }

        事实上,通过全剧模式来安装的所有模块包都被安装进了一个统一的目录下,这个目录可以通过如下方式推算出来:path.resolve(process.execPath, '..', '..', 'lib', 'node_modules')

        如果 node 的可执行文件的位置是 /usr/local/bin/node, 那么模块目录就是 /usr/local/lib/node_modules。最后,通过软链接的方式将 bin 字段配置的可执行文件链接到 Node 的可执行目录下。

    2.6.2 从本地安装

        当由于网络问题,或者安装本地开发测试包,我们可以 npm install '../../koa'

    2.6.3 npm 钩子命令

        package.json 文件中我们可以使用如下配置:

        "script": {

            "preinstall" : "preinstall.js"

            "install" : "install.js"

            "uninstall" : "uninstall.js"

            "test" : "test.js"

        }

        在以上字段执行 npm install <package> 时,preinstall指向的脚本将会被加载执行,然后 install 指向的脚本会被执行。 在执行 npm uninstall <package> 时,uninstall 指向的脚本也许会做一些清理工作等。

    2.6.4 注册包仓库账号

        为了维护包,NPM必须要使用仓库账号才允许将包发布到仓库中。注册账号的命令如下, 一个问答式的交互过程

            npm adduser

            Username: (xmyxm)

            Email: xmyxm@outlook.com

    2.6.5 上传包

        npm publish //发布正式包

        npm publish --tag beta // 发布标签为 beta 的测试包

    2.6.5 管理包

        如果一个包多人开发发布,需要添加权限

            npm owner ls <package name> // 查看

            npm owner add <user> <package name> //添加权限

            npm owner rm <user> <package name> //删除权限

     2.6.6 分析包

        npm ls //分析包的依赖树


标签: node基础 node知识点锦集 最后修改时间:2018-8-25 17:27:05
晨曦沐枫

魔都漂泊码农一枚,平常热衷于分享探讨一些新技术,喜欢挑战又不忘初心,所以写了这么一个站点和大家分享交流,主要分享还是前端技术为主,也有记录工作经验和生活感悟。

由于个人水平有限,所以博客中的文章难免有错误或者不正确的地方,欢迎在文章下方留言,楼主看到会及时改正。

博客是我利用空闲时间维护的一个小项目,如有异常或者报错(一般异常都hold住了,手动微笑),欢迎留言或者邮件,楼主尽早修正,楼主已推出移动版blog,欢迎使用。

联系邮箱:myco_xmy@qq.com