快速学习nodejs系列:十二、npm与模块概念
npm
在安装完nodejs后,通过git bash等客户端,输入 npm -v
上图显示的是npm的版本。
那npm是什么呢?
官网定义:npm is the package manager for JavaScript and the world’s largest software registry. Discover packages of reusable code — and assemble them in powerful new ways.
简单地说npm 是js(不仅是nodejs、还可以是react、react-native等)的包管理工具(包也叫模块),是目前最大的开源平台 http://www.npmjs.com。你可以在npm服务器中下载别人写的第3方包供自己使用,同时也可以把自己实现的功能提交上去供别人下载使用。
npm 常用命令:
//初始化目录(创建package.json)
npm init
//修改包下载源
npm config set registry https://registry.npm.taobao.org 修改包下载源,此例修改为了淘宝镜像。墙,你懂的。
//下载第3方模块到本地
npm install //安装package.json的dependencies中的包到本地
npm install packagename //下载包到本地
npm install packagename -g //全局安装,各项目可共用,不用重复下载
npm install packagename --save //package.json的dependencies属性下添加packagename 即正式的用到的依赖
npm install packagename --save-dev //package.json的devDependencies 属性下添加packagename 即开发依赖依赖
说明:
npm install 在安装 npm 包时,有两种命令参数可以把它们的信息写入 package.json 文件,一个是npm install --save另一个是 npm install --save-dev,他们表面上的区别是--save 会把依赖包名称添加到 package.json 文件 dependencies 键下,--save-dev 则添加到 package.json 文件 devDependencies 键下。--save是对生产环境所需依赖的声明(开发应用中使用的框架,库),--save-dev是对开发环境所需依赖的声明(构建工具,测试工具).正常使用npm install时,会下载dependencies和devDependencies中的模块,当使用npm install --production或者注明NODE_ENV变量值为production时,只会下载dependencies中的模块。
上图是安装express的结果,会在本目录下新增node_modules文件夹,里面也有express模块
//删除模块
npm uninstall packagename
//更新模块
npm update packagename
注意:上面这几个命令是经常用到的,其实还有一些,具体可以看下:https://www.npmjs.com.cn/
package.json
上图是package.json的属性,其中最为核心的是dependencies和devDependencies
package.json文件作用:在nodejs的实践中,我们会发现nodejs开发应用其实是一个不断引用别人模块的过程。模块是一些功能的封装,一些常用的功能已经有人封装好并发布在npm社区中,我们只需npm install packagename 即可。当我们自己开发好一个应用系统后,想分享给别人。这时,我们没有必要分享我们引用的第3方模块,我们可以通过package.json来管理我们的依赖包。比如:我们项目目录是wechat,在wechat目录里npm init ,wechat目录中会生成package.json,其中的dependencies属性会记录下我们所依赖的模块。这时,我们把wechat项目的代码分享给别人,我们是不用发node_modules文件夹的(会很大);别人只要在wechat,执行npm install 即可下载到dependencies中所需的依赖包(模块)。
模块概念
模块(module),在nodejs中是以模块为单位来划分所有功能,并提供了一个模块的加载机制。
狭义地来说,每一个js文件都是一个模块;而多个js文件之间可以通过require,共同形成一个功能整体对外,称为广义的模块。
在nodejs中,一个js文件中定义的变量、函数,都只能在这个文件有效,若外部文件要用的话,必须要用exports暴露出去,外部要通过require使用。
例子:
a.js内容:
var msg = 'hello nodejs';
exports.msg = msg;
在b.js要使用a.js的msg变量,b.js内容:
var a = require('./a.js');
console.log(a.msg);//结果:hello nodejs
小结:js文件中,可用exports暴露很多东西,如变量、函数、类等。在使用者中,只需require。就是说,js文件之间是通过exports(具体的方式有2种:1.module_exports、2.exports.变量)和require连接,并不是通过html。
require()方法的几种使用形式:
//1.相对、绝对路径
require('./a.js')、require('/d/wechat/a.js')
//2.没写 './'
1.require('a.js')
这时nodejs会将该文件视为node_module目录下的一个文件。注意:node_module文件不一定要在同级,在任何的祖先级目录都可以。
//3.没写 './'和'js'
require('a')
这种是引入文件夹,引入的是a文件夹下的入口文件(package.json中的main,默认是index.js)。即nodejs将会引用node_modules目录下的a文件夹下的index.js文件
下一节,会使用nodejs实现restful api、cookie、session的简单例子。