大家好,我是IT修真院深圳分院第3期的学员,一枚正直纯洁善良的前端程序员,今天给大家分享一下,修真院官网前端工程师【JS-06】深度思考中的知识点——如何使用npm?cnpm又是什么?
1.背景介绍
(1)什么是npm
npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装、卸载、管理依赖等), NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,它是 Node 获得成功的重要原因之一。常见的使用场景有以下几种:
允许用户从NPM服务器下载别人编写的第三方包到本地使用。
允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 "npm -v" 来测试是否成功安装
为啥我们需要一个包管理工具呢?因为我们在Node.js上开发时,会用到很多别人写的JavaScript代码。如果我们要使用别人写的某个包,每次都根据名称搜索一下官方网站,下载代码,解压,再使用,非常繁琐。于是一个集中管理的工具应运而生:大家都把自己开发的模块打包后放到npm官网上,如果要使用,直接通过npm安装就可以直接用,不用管代码存在哪,应该从哪下载。
更重要的是,如果我们要使用模块A,而模块A又依赖于模块B,模块B又依赖于模块X和模块Y,npm可以根据依赖关系,把所有依赖的包都下载下来并管理起来。否则,靠我们自己手动管理,肯定既麻烦又容易出错。
(2)什么是cnpm?
因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事。来自官网:“这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。”
2.知识剖析
npm常用指令
1、npm install moduleNames:安装Node模块
安装完毕后会产生一个node_modules目录,其目录下就是安装的各个node模块。
node的安装分为全局模式和本地模式。
一般情况下会以本地模式运行,包会被安装到和你的应用程序代码的本地node_modules目录下。
在全局模式下,Node包会被安装到Node的安装目录下的node_modules下。
全局安装命令为$npm install -g moduleName。
获知使用$npm set global=true来设定安装模式,$npm get global可以查看当前使用的安装模式。
示例:
npm install express
默认会安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本,如npm install [email protected]
npm install name -g
将包安装到全局环境中
但是代码中,直接通过require()的方式是没有办法调用全局安装的包的。全局的安装是供命令行使用的,就好像全局安装了vmarket后,就可以在命令行中直接运行vm命令
这里的require()是node.js内置函数,用来引入其他模块以备代码中调用模块的函数和变量,默认下node.js会在NODE_PATH和目前js所在项目目录下的node_modules文件夹下去寻找模块
npm install name --save
安装的同时,将信息写入package.json中项目路径中如果有package.json文件时,直接使用npm install方法就可以根据dependencies配置安装所有的依赖包,这样代码提交到github时,就不用提交node_modules这个文件夹了。
npm root:查看当前包的安装路径
npm root -g:查看全局的包的安装路径
npm -v:查看npm安装的版本
npm list --depth=0:查看所有高级的npm moudles
npm list --depth=0 -global:查看所有全局安装的模块
为什么要保存至package.json?
因为node插件包非常大,版本庞杂,所以不加入package信息,模块间的依赖变得非常困难,将配置信息写入package.json并将其加入版本管理,其他开发者对应下载即可(命令提示符执行npm install,则会根据package.json下载所有需要的包)。
每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。npm install 命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。
使用npm卸载插件:npm uninstall < name > [-g] [--save-dev] PS:不要直接删除本地插件包
使用npm更新插件:npm update < name > [-g] [--save-dev]
更新全部插件:npm update [--save-dev]
查看npm帮助:npm help
查看当前目录已安装插件:npm list
PS:npm安装插件过程:从http://registry.npmjs.org下载对应的插件包(该网站服务器位于国外,所以经常下载缓慢或出现异常),解决办法就是cnpm
cnpm介绍:
官方网址:http://npm.taobao.org
安装:命令提示符执行npm install cnpm -g --registry=https://registry.npm.taobao.org
注意:安装完后最好查看其版本号cnpm -v或关闭命令提示符重新打开,安装完直接使用有可能会出现错误
PS:cnpm跟npm用法完全一致,只是在执行命令时将npm改为cnpm。
Package.json 属性说明:
name - 包名。
version - 包的版本号。
description - 包的描述。
homepage - 包的官网 url 。
author - 包的作者姓名。
contributors - 包的其他贡献者姓名。
dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
main - main 字段是一个模块ID,它是一个指向你程序的主要项目。就是说,如果你包的名字叫 express,然后用户安装它,然后require("express")。
keywords - 关键字
3.常见问题
如何安装npm?
4.解决方案
1.前往nodejs官网下载nodejs,https://nodejs.org/en/,建议下载稳定版的,下载后运行安装即可。安装完毕之后,在cmd中输入node -v查看是否已经安装成功,如果有版本号显示,则代表安装成功。
2.接下来我们尝试输入npm -v
也有版本号,其实,nodejs自带npm,所以我们不需要额外安装就可以了。 接下来,我们需要配置npm的全局模块的存放路径以及cache的路径,例如我希望将以上两个文件夹放在NodeJS的主目录下,便在NodeJs下建立“node_global”及“node_cache”两个文件夹。我们就在cmd中键入两行命令:
npm config set prefix "D:\Program Files\nodejs\node_global"
npm config set cache "D:\Program Files\nodejs\node_cache"
下面这一步非常关键,我们需要设置系统变量。进入我的电脑→属性→高级→环境变量。在系统变量下新建“NODE_PATH”,输入“D:\Program Files\nodejs\node_global\node_modules”
5.编码实战
6.扩展思考
cnpm有哪些问题?
1.cnpm 的仓库只是 npm 仓库的一个拷贝,它不承担 publish 工作,所以你用 cnpm publish 命令会执行失败的
2.不仅是 publish 会执行失败,其它的需要注册用户(npm adduser)、或者修改 package 状态等命令都无法用 cnpm
7.参考文献
参考一:npm 模块安装机制简介
参考二:开发者对 npm 公司不满,unpublish 了自己的所有模块
8.更多讨论
npm和bower有什么异同之处?
Q:bower和npm的异同点?
npm是node js的包管理器,用来下载安装node js的第三方工具包,也可以用来发布你自己开发的工具包。bower是一个前端库管理的工具,管理一些js库,比如说jQuery,bootstrap等
Q:全局安装和本地安装的区别?
因为全局模式安装,包可以供所有的程序使用。本地安装则不可以。
npm 默认会把包安装到当前目录下。这反映了 npm 不同的设计哲学。如
果把包安装到全局,可以提高程序的重复利用程度,避免同样的内容的多
份副本,但坏处是难以处理不同的版本依赖。如果把包安装到当前目录,
或者说本地,则不会有不同程序依赖不同版本的包的冲突问题,同时还减
轻了包作者的 API 兼容性压力,但缺陷则是同一个包可能会被安装许多次。
本地安装方式是键入命令:npm install gulp 或 npm install gulp --save-dev等,其中参数--save-dev的含义是代表把你的安装包信息写入package.json文件的devDependencies字段中,包安装在指定项目的node_modules文件夹下。
本地安装后可以直接通过require()的方式引入项目中node_modules目录下的模块。
Q:为什么进行了全局安装还要进行本地安装
1、在js实例代码中,默认下node.js会在NODE_PATH和目前js所在项目下的node_modules文件夹下去寻找模块,因此,如果只是全局安装,不能直接通过require()的方式去引用模块,需要手动解决包路径的配置问题,当然你也可以复制全局安装的node_modules文件夹到项目下,还有办法可以选择将环境变量的NODE_PATH设置为C:\Program Files\nodejs。
2.对于包的更新不好管理,可能你需要为每个包重新命名,如[email protected]、[email protected]...,为了区别不同项目使用指定的包,保证模块之间的相互依赖(这块下面会介绍),区别每个项目正常运行
PPT连接:
PPT
视频链接
如果这篇文章对你有帮助,并且使你对修真院免费在线学习感兴趣,可以通过我的链接注册成员会,这会使我得到学分(兑换学时)延长学习时间:
邀请链接:http://www.jnshu.com/login/1/13374512
邀请码:13374512