nodejs笔记(部分内容参考七天学会nodejs)
一,模块
1.基本上是分模块进行的,比如将每一个功能拆分到每一个模块中,然后分别调用。
2.其中模块一般是有这些变量:require、exports、module。
3.require 函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。模块名可使用相对路径(以./开头),或者是绝对路径(以/或C:之类的盘符开头)。另外,模块名中的.js扩展名可以省略。相当于Java的import或者php的require。(注意,可以使用这个方式加载json信息)
4.exports 对象是当前模块的导出对象,用于导出模块公有方法和属性。别的模块通过require函数使用当前模块时得到的就是当前模块的exports对象。相当于public的方法,就是有些方法可以公布给外面使用.
5.module 对象可以访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象。例如模块导出对象默认是一个普通对象,如果想改成一个函数的话,可以使用以下方式。
module.exports = function () {
console.log('Hello World!');
};
6.模块的初始化:一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象。之后,缓存起来的导出对象被重复利用。
7.主模块:通过命令行参数传递给NodeJS以启动程序的模块被称为主模块。主模块负责调度组成整个程序的其它模块完成工作。类似于网站的主要入口,一般可以定义为main.js或者index.js等。
示例:
目录结构:
/home/user/hello/
- util/
counter.js
main.js
其中counter.js内容
var i = 0;
function count() {
return ++i;
}
exports.count = count;//发布count方法
主模块main.js内容
var counter1 = require('./util/counter');
var counter2 = require('./util/counter');
console.log(counter1.count());
console.log(counter2.count());
console.log(counter2.count());
运行该程序的结果
$ node main.js
1
2
3
//得出结论,counter并没有多次调用
二. 代码组织和部署
1.模块路径的解析规则:
require路径规则:一般情况下,为了避免强耦合,可以采用下面的几种形式进行传递路径。
1.内置模块,就是如果调用的是nodejs内置模块名称,可以直接使用模块名称作为传入值,比如require('fs')
2.node_modules目录,即nodejs定义了一个特殊的目录用来存放模版块,在该目录下可以直接用文件夹名加模块名就可以使用了,比如:调用require('foo/bar'),则nodejs依次调用的是:/同级目录/node_modules/foo/bar->/父级目录/node_modules/foo/bar->/node_modules/foo/bar。
3.NODE_PATH环境变量,与PATH环境变量类似,NodeJS允许通过NODE_PATH环境变量来指定额外的模块搜索路径。NODE_PATH环境变量中包含一到多个目录路径,路径之间在Linux下使用:分隔,在Windows下使用;分隔。比如:定义了以下NODE_PATH环境变量:NODE_PATH=/home/user/lib:/home/lib,当使用require('foo/bar')的方式加载模块时,则NodeJS依次尝试以下路径。 /home/user/lib/foo/bar-> /home/lib/foo/bar。
2.包:所有的子模块,即nodejs程序是由很多个js模块组成的,然而有些时候我们需要的模块是有多个子模块组成,这个时候可以用包的概念进行对这些子模块进行管理。
1.需要有一个入口,即该入口的导出对象作为包的导出对象(exports)。
2.示例:
包的结构:
- /home/user/lib/
- cat/
head.js
body.js
main.js
其中main.js为主要的入口,如下:
var head = require('./head');
var body = require('./body');
exports.create = function (name) {
return {
name: name,
head: head.create(),
body: body.create()
};
};
这个时候可以用require('/home/user/lib/cat/main')去调用他,如果将main命名为index.js,既可以用这样的语句进行调用var cat = require('/home/user/lib/cat');如果不想命名index,但是又不想写入口模块,这个时候可以改变结构,如下
- cat/
-
/home/user/lib/
- cat/
- doc/
- lib/
head.js
body.js
main.js - tests/
package.json
其中主要作用在于package.json文件里面,可以设置
{
"name": "cat",
"main": "./lib/main.js"
}
便可不用写入口模块名称了。
3.命令行程序:
nodejs写东西一般就是写包或者命令行,其实写包的目的就是更好的写命令行程序,所以我们可以写点脚本让我们写的包像命令行。
在Windows系统下的做法完全不同,我们得靠.cmd文件来解决问题。假设node-echo.js存放在C:\Users\user\bin目录,并且该目录已经添加到PATH环境变量里了。接下来需要在该目录下新建一个名为node-echo.cmd的文件,文件内容如下:
@node "C:\User\user\bin\node-echo.js" %*
这样处理后,我们就可以在任何目录下使用node-echo命令了。4.npm的作用:
1.允许用户从NPM服务器下载别人编写的三方包到本地使用。
2.允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
3.允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
4.常用命令:
1.下载第三方包:在工程目录文件夹下,使用该命令
npm install 名字
npm install 名字@版本号
2.使用package.json进行声明第三方包依赖,写法如下:
{
"name": "node-echo",
"main": "./lib/echo.js",
"dependencies": {
"argv": "0.0.2"
}
}
3.发布代码:在package.json文件中需要定义该字段
{
"name": "node-echo", # 包名,在NPM服务器上须要保持唯一
"version": "1.0.0", # 当前版本号
"dependencies": { # 三方包依赖,需要指定包名和版本号
"argv": "0.0.2"
},
"main": "./lib/echo.js", # 入口模块位置
"bin" : {
"node-echo": "./bin/node-echo" # 命令行程序名和主模块位置
}
}
然后使用npm publish进行发布,当然,之前还需要有帐号,即用npm adduser进行登录。
4.版本号规则:X.Y.Z分别代表主版本号、次版本号和补丁版本号。原则如下:
如果只是修复bug,需要更新Z位。
如果是新增了功能,但是向下兼容,需要更新Y位。
如果有大变动,向下不兼容,需要更新X位。
5.其他命令:
1.NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。
2.使用npm help可查看某条命令的详细帮助,例如npm help install。
3.在package.json所在目录下使用npm install . -g可先在本地安装当前命令行程序,可用于发布前的本地测试。
4.使用npm update可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。
5.使用npm update -g可以把全局安装的对应命令行程序更新至最新版。
6.使用npm cache clear可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。
7.使用npm unpublish @可以撤销发布自己发布过的某个版本代码。 - cat/
(注:(打个小广告,小编别删,谢谢)楼主独自开发的app已经上线了,可以直接在网页应用宝或者百度手机助手搜索下载:面试圈,或者点击该链接面试圈,如果对这个app感兴趣的,可以联系楼主,与楼主一起开发!当然,该app也是对于面临面试的同学来场不错的巩固!面试圈,不用搜的面试题!后续学了更多会陆续更新!)