摘要:包与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或CMDvar hasDefine = typeof define === 'function',// 检查环境是否为NodehasExports = 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;
});

点击关注,第一时间了解华为云新鲜技术~

带你了解Node.js包管理工具:包与NPM相关推荐

  1. Node.js 进程管理工具

    pm2 is a process manager for Node apps with a builtin load-balancer. pm2项目: https://github.com/Unite ...

  2. [Node] Node.js 包管理工具详解npm yarn cnpm npx pnpm

  3. 前端工程化-包管理工具npm-yarn-cnpm-pnpm详细介绍以及如何选择

    文章目录 包管理工具详解 npm包管理工具 1.代码共享的方案 2.npm包管理工具介绍 3.npm的配置文件 常见配置文件 常见配置文件属性 版本号的说明 4.npm install npm ins ...

  4. Nodejs入门 (四) 包管理工具(npm、cnpm、yarn、nvm)

    目录 一.什么是包管理工具? 二.npm的使用 1.初始化 2.搜索包 3.下载安装包 4.安装包的使用 5.全局安装 6.安装包依赖 7.安装指定版本的包 8.删除依赖 9.配置命令别名 10.np ...

  5. NPM:nodejs官方包管理工具的简介、安装、使用方法之详细攻略

    NPM:nodejs官方包管理工具的简介.安装.使用方法之详细攻略 目录 NPM之nodejs官方包管理工具的简介 NPM之nodejs官方包管理工具的安装 NPM之nodejs官方包管理工具的使用方 ...

  6. linux上C++开发——1. C++包管理工具

    文章目录 1. 包管理器的作用 1.1 常见的包管理器 1.2 C++使用第三方库的方式 1.3 C++包管理器的诞生 1. 常见的C++包管理工具 1.1 Conan 1.2 vcpkg 1.3 其 ...

  7. javascript包管理工具发展历史

    npm和yarn都是javascript包管理工具:因为npm在使用过程中暴露出一些问题:但恰恰yarn下载依赖包和包版本管理等方面比较有优势:所以其中yarn快速发展:但是npm后续也在不断完善,所 ...

  8. (18) Node.js npm包管理工具

    一.npm概述 npm (Node Package Manager)是 Node.js 的包管理工具. 什么是包?包就是一坨代码,就是 Node.js 的第三方模块. 例如:JQuery模块,Boot ...

  9. node.js中npm包管理工具

    现在安装node.js,默认就会帮我们装上了npm包管理工具,npm主要用来下载,安装,管理第三方模块. 创建一个包描述文件: npm init [-y] 查看包的信息 npm info <pa ...

  10. Node.js学习之路--npm包管理工具操作汇总

    因为在学习使用Express(第三方Web开发框架)时需要下载这个包,所以使用npm包管理工具这个相关的操作,现在将其相关的操作进行汇总. npm命令在cmd或者powershell中进行;注意:使用 ...

最新文章

  1. 圆桌讨论:人工智能的未来
  2. mysql更新记录删除_mysql 插入-更新-删除
  3. 在伦敦工作生活—随笔-1
  4. Bugku 杂项 隐写2 Welcome_.jpg
  5. python redis 消息队列
  6. Andriod 破解之道(一)
  7. ExtJS + Gears
  8. 人类史上20个“最强大脑”
  9. 几个实用的Servlet应用例子-入门、cookie、session及上传文件
  10. GTK+图形化应用程序开发学习笔记(五)—组装盒、组合表、固定容器构件
  11. 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
  12. Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat 解决办法
  13. 从0开始构建一个属于你自己的PHP框架
  14. mysql下载备份数据库命令行_MYSQL 数据库导入导出命令 | 很文博客
  15. za压缩图片的几种方法
  16. 群贤路附近哪有计算机学校,群贤路口附近展览馆、会展中心
  17. 健康菜谱微信小程序+项目前后台源码(JavaSSM+Mysql)
  18. 使用Python快速生成二维码的两种方式及二维码解码
  19. Java 中的 int 型转为 long 型
  20. windows 7 出现MTP usb设备驱动安装问题解决方法

热门文章

  1. 云架构师是做什么的_为什么以及如何成为云架构师
  2. ES6中的常用知识点总结
  3. 第三十三章 机械化印刷
  4. CMakeList.txt的简介
  5. c#上传文件程序在本地测试没问题发布到服务器上就,高分求助!!!C#为什么程序在本地运行没有问题,但布署到服务器上后就不行了呢...
  6. mysql pconnect_mysql_pconnect()
  7. roobo机器人怎么唱歌_日本推出机器人“妻子”,拥有3大功能,能替代真人伴侣吗?...
  8. linux pivot root,[mydocker]---通过例子理解chroot 和 pivot_root
  9. mysql触发器_MySQL视图\触发器\事务初步认识
  10. 洛谷P4720 【模板】扩展卢卡斯