带你了解Node.js包管理工具:包与NPM
摘要:包与NPM Node组织了自身的核心模块,也使得第三方文件模块可以有序的编写和使用。
本文分享自华为云社区《NodeJs深入浅出之旅:包与NPM》,作者:空城机。
包与NPM
Node组织了自身的核心模块,也使得第三方文件模块可以有序的编写和使用。
但是在第三方模块中,模块与模块之间仍然是散列在各地的,相互之间不能直接引用
所以在模块外,包和NPM是将模块联系起来的机制。
- 包组织模块示意图
CommonJS 的包规范定义其实也很简单,由包结构和包描述文件两部分组成。
包结构
用于组织包中的各种文件,是一个存档文件,即一个目录直接打包为.zip或tar.gz格式的文件。
符合规范的包目录:
- package.json: 包描述文件
- bin: 用于存放可执行二进制文件的目录
- lib: 用于存放JavaScript代码的目录
- doc: 用于存放文档的目录
- test: 用于存放单元测试用例的代码
package.json包描述文件
NPM所有行为都与包描述文件的字段息息相关
一些字段:
- name: 包名。 规范定义需要用小写的字母和数字组成,不允许出现空格。 包名必须是唯一的,以免对外公布时产生重名冲突
- description: 包简介
- version: 版本号,关于其介绍在《Node.js学习(一)——简介》也有提及
- keywords: 关键字数组, NPM中主要用来作分类搜索。
- maintainers: 包维护者列表。 每个维护者由name、email和web这3个属性组成。 NPM通过这个属性进行权限认证。
格式:
"maintainers":[{ "name":"kongchengji", "email":"111@.com", "web":"[http:](https://blog.csdn.net/qq_36171287)" }]
- contributors: 贡献者列表,格式与维护者列表相同
- bugs: 一个可以反馈bug的网页地址或邮件地址
- licenses: 当前包所使用的许可证列表,表示包在哪些许可证下使用
格式:
"licenses":[{ "type": "GPLv2", "url":"" }] // 或者 "license": "ISC"
- repositories: 托管源代码的位置列表,表明可以通过哪些方式和地址访问包源代码。
格式: - "repository": {
- "type": "git",
- "url": "git+https://github.com/kongchengji/UiSelfMade.git"
- },
- dependencies: 使用当前包所需要依赖的包列表。 这个属性非常重要
- homepage: 当前包的网站地址
- os: 操作系统支持列表, 如果列表为空,则不对操作系统做任何假设
- cpi: CPU架构支持列表
- engine:支持的JavaScript引擎列表
- directories:包目录说明
- implements: 实施规范的列表。 标志当前包实现了CommonJS哪些规范
- scripts: 脚本说明对象。 主要用于被包管理器用来安装、编译、测试和卸载包
格式:
"scripts": { "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", "start": "npm run dev", "lint": "eslint --ext .js,.vue src", "build": "node build/build.js" },
NPM与包规范区别在于多了四个字段:
- author: 包作者 :ok_man:
- bin: 一些包作者希望包可以作为命令行工具使用。
- main: 模块引入包时,会有限检查这个字段,并将其作为包中其余模块的入口模块。 如果不存在,require会查找包目录下的index.js、index.node、index.json作为默认入口
- devDependencies: 一些模块只在开发时需要依赖。
devDependencies:开发环境使用
dependencies:生产环境使用
前后端共用模块
JavaScript在Node出现后,有一项优势 --> 一些模块可以在前后端实现共用。
但是前后端上始终还是有一些差别的 :sweat_drops:
前后端模块侧重点
前后端JavaScript分别搁置在HTPP的两端,扮演的角色并不同。
浏览器端的JavaScript需要经历从同一个服务器端分发到多个客户端执行,瓶颈是带宽,从网络加载代码
服务器端的JavaScript是相同代码需要多次执行,瓶颈是CPU和内存等资源,从磁盘中加载
在前端JavaScript中,主要还是应用AMD规范。
CommonJS并不完全适用于前端JavaScript,比如Node的模块引入基本是同步的,但是前端引入如果使用同步引入,UI在初始化过程中需要花费很多时间等待脚本加载完成。
AMD规范
AMD规范 是CommonJS规范的一个延伸,全称:Asynchronous Module Definition。
是异步模块定义
模块定义:define(id?, dependencies?, factory);
id 是模块的名字,它是可选的参数。
dependencies 指定了所要依赖的模块列表,它是一个数组,也是可选的参数
AMD需要在声明模块时指定所有的依赖,通过形参传递依赖到模块内容中:
define(['./a', './b'], function (dep1, dep2) { a.doSomethimg() b.doSomething() });
CMD规范
与AMD规范相对的还有CMD规范,全称:Common Module Definition。
是公共模块定义
这是由国内的玉伯(也是一位大佬)提出的
模块定义:define(factory)
CMD支持动态引入:
define(function(require, exports, module) { var a=require('./a') a.doSomethimg() var b=require('./b') b.doSomething() })
在需要依赖模块时, 随时调用require()引入即可
- CMD 推崇依赖就近; AMD 推崇依赖前置
- CMD 是延迟执行; AMD 是提前执行
- CMD性能好,因为只有用户需要的时候才执行; AMD用户体验好,因为没有延迟,依赖模块提前执行了
AMD和CMD最大的区别是对依赖模块的执行时机处理不同
兼容多种模块规范
创建一个hello方法,让hello方法能在不同运行环境中运行,兼容Node、AMD、CMD和常见浏览器
- 匿名函数前加一个;是个好习惯 name是方法名,definition是方法体
- 通过typeof检测环境是否为AMD或CMD还是Node环境
- 可以将模块执行结果挂载在window变量中,这样可以直接调用
// 匿名函数前加一个;是个好习惯 name是方法名,definition是方法体 ;(function (name, definition) { //检查环境是否是AMD或CMD var hasDefine = typeof define === 'function', // 检查环境是否为Node hasExports = typeof module !== 'undefined' && mudule.exports; if(hasDefine) { define(definition); } else if (hasExports) { module.exports = definition(); } else { // 将模块的执行结果挂在window变量中,在浏览器中this指向window对象 this[name] = definition(); } })('hello', function () { var hello = function () { console.log('hello'); } return hello; });

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
CANN 5.0黑科技解密 | 算力虚拟化,让AI算力“物尽其用”
摘要:算力虚拟化技术对消费者而言,可有效降低算力的使用成本,对于设备商或运营商而言,则可极大提升算力资源的利用率,降低设备运营成本。 为什么要做算力虚拟化 近年来,人工智能领域呈井喷式发展,算力就是生产力,以AI集群为基础的人工智能计算中心在国内多点开花,为政府、企业及个人,提供了一种新的城市公共资源,成为了智能世界的“黑土地”。 算力资源共享势必会带来资源分配问题,无论是人工智能计算中心这种大型AI基础设施还是AI计算卡这种小型AI计算资源,都承载着用户多样化的AI算力诉求。 比如,在某些算力要求不高的场景下,AI模型在训练或推理时并不需要占用整张AI计算卡,希望更低的资源配置满足要求,比如1/4切片;再或者,在教学场景,一台AI服务器(可由单张或多张计算卡组成)希望可共享给整个班级使用。 借助虚拟化技术可轻松应对以上问题! 我们将整卡或整机的计算资源虚拟化为多个虚拟计算设备,并在上面部署不同的虚拟机或容器,分别运行AI训练或推理应用服务。 对消费者而言,可有效降低算力的使用成本,对于设备商或运营商而言,则可极大提升算力资源的利用率,降低设备运营成本。 业界常见虚拟化技术 业界常见的...
- 下一篇
CHINER[元数建模]-v3.5.4 发布:最好用的国产开源数据库建模平台
CHINER元数建模软件介绍:PDMan升级换代至->CHINER[元数建模]v3.0:最好用的国产开源数据库建模平台 3.5.4版本升级内容清单 1.修复复制关系图时自动创建的数据表重复的问题 2.标签页关闭时提供关闭校验 3.修复某些场景下导入PDMan文件报错的问题 4.模板数据新增数据字典信息,支持操作对数据字典的子项进行遍历 5.优化弹窗按钮颜色 6.修复选择继承字段时无法点击按钮的问题 7.数据库逆向时,数字被增加了单引号问题 8.数据库逆向时,括号中内容被解析到注释中去的问题 历史版本发布内容 v3.0版: 7月17日,PDMan升级换代至->CHINER[元数建模]v3.0:最好用的国产开源数据库建模平台 v3.1版: 8月8日,PDMan的最新版-CHINER[元数建模]升级至v3.1:最好用的国产开源数据库建模平台 v3.2版: 8月22日,PDMan的最新版-CHINER[元数建模]升级至v3.2:最好用的国产开源数据库建模平台 9月07日,PDMan的最新版-CHINER[元数建模]升级至v3.2.1:最好用的国产开源数据库建模平台 v3.3版: 9...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Hadoop3单机部署,实现最简伪集群
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题