这是一篇没耐心的nodejs教程,写给希望迅速上手的学习者。基础篇介绍权限,模块,包,工程目录结构,npm等,不涉及常用api和中间件等。
一、权限问题
linux下,nodejs需要监听80或443端口提供HTTP(S)服务时需要root权限。
有两种方式:
- (1)(推荐)需要js提供root权限
$ sudo node server.js
- (2)使用chmod+s命令让nodejs总是以root权限运行,不安全。
$ sudo chown root /usr/local/bin/node
$ sudo chmod +s /usr/local/bin/node
二、模块
一个文件为一个模块,一个文件路径为一个模块名。
编写模块时,有require,exports,module三个变量。
- 2.1 required
导入某个模块var foo1 = required(‘./foo’);//.js后缀可以省略
var foo2 = required(“./foo.js”);
也可以加载或者导入一个json:
var data = require(‘./data.json’);
2.2 exports
是当前模块的导出对象,用于导出模块共有方式和属性。exports.hello = function(){
console.log(‘Hello World!’);
};
2.3 module
可以访问当前模块的一些信息,最多的用途就是替换当前模块的到处对象。module.export = function(){
console.log(‘Hello World!’);
};
三、模块初始化
NodeJS使用CMD模块系统,主模块作为程序入口点,所有模块在执行过程中只初始化一次。
初始化一次
一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象。之后,缓存起来的导出对象被重复利用。
3.1 主模块
通过命令行参数传递给NodeJS以启动程序的模块被称为主模块。主模块负责调度组成整个程序的其他模块完成工作。默认是路径下的main.js。3.2 二进制模块(不推荐)
nodejs支持使用c/c++编写二进制模块。编译好的二进制模块除了文件扩展名是.node外,和JS块的使用方式相同。
四、模块路径解析规则
除了相对路径和绝对路径外,require函数还支持第三种形式的路径。
4.1 内置模块
4.2 node_modules目录
专门存放模块的路径。比如某个模块的绝对路径是/home/user/hello.js, 在该模块中使用require(‘foo/bar’)方式加载模块,则NodeJS依次尝试使用以下路径。/home/user/node_modules/foo/bar
/home/node_modules/foo/bar
/node_moduels/foo/bar4.3 NODE_PATH环境变量
指定额外的模块搜索路径。因为是额外,所以最后搜索。
使用:设置NODE_PATH环境变量,linux用:分隔,windows使用;分隔。
五、包
5.1 入口模块
多个js模块,组成一个包。所有模块都是同一个路径里,且需要指定一个入口模块,入口模块的导出对象作为包的导出对象。
比如cat目录下有main.js,lib1.js,lib2.js。
main.js作为入口模块,require lib1.js,lib2.js。5.2 index.js
当模块文件名为index.js,加载模块时就可以使用模块所在目录的路径代替模块文件路径,如可写成
var cat = require(‘/home/user/lib/cat’);
var cat = require(‘/home/user/lib/cat/index’);5.3 自定义入口模块和存放位置(package.json)
如果你想自定义入口模块的文件名和存放位置,就需要在包目录下包含一个package.json文件,如{
“name”: “cat”, “main”: “./lib/main.js"
}
如此一来,就可以用require(‘/home/user/lib/cat’)加载。
六、命令行程序
将固定node命令开头执行的方式,变成命令行的方式。
node xx.js [param] => xx [param],
如$node /home/user/bin/node-echo.js Hello World
变成
$node-echo Hello World
简便很多
那么如何做到,只讲在linux下怎么做:
- (1)node-echo.js顶部增加
#!/usr/bin/env node
- (2)然后增加执行权限,并再/usr/local/bin下创建软链接
$ chmod +x /home/user/bin/node-echo.js
$ sudo ln -s /home/user/bin/node-echo.js /usr/local/bin/node-echo
七、工程目录结构
- /home/user/workspace/node-echo/
- bin/
node-echo
- doc/
- lib/
echo.js- node_modules/
- argv/
- tests/
package.json
README.md
其中部分文件:
/ bin/node-echo /
var argv = require(‘argue’),
echo = require(‘../ilb/echo’);
console.log(echo(argv.join(‘ ‘)));/ lib/echo.js/
module.exports = function(message){
return message;
}/ pacakge.json /
{
“name”:”node-echo”,
“main”:”./lib/echo.js”
}
八、NPM:包管理工具
(1)允许用户从NPM服务器下载别人编写的三方包到本地使用。
(2)允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
(3)允许用户将自己编写的包或者命令行程序上传到NPM服务器供别人使用。
- 8.1 下载第三方包
一般这样使用别人的包(如argv),
在项目目录下,npm install argv@1.1.1,那么argv包就会放到node_modules目录下,直接require(‘argv’)就可以使用了。
依赖的包比较多时,通过package.json字段做了扩展。
如:
{
“name”: “node-echo”,
“main”: “./lib/echo.js”,
“denpendencies”:{
“argv”: “0.0.2”
}
}
然后在工程目录,npm install即可。btw,传递的依赖会被自动下载。
- 8.2 安装命令行工具
如上面例子的node-echo,只要node-echo自己配置好了对应的package.json字段,对于用户而言,这样安装:
$ npm install node-echo -g
其中-g表示全局安装,node-echo会默认安装到以下位置,并且NPM会自动创建好Linux系统下需要的软链文件。
- /usr/local/
- lib/node_modules/
- node-echo/
…- bin/
node-echo
…
- 8.3 发布代码
第一次发布npm,需要注册个号码。执行npm adduser,按提示操作。账号完成设置后,编辑需要发布的项目的package.json,加入npm必须字段。
如:
{
“name”: ”node-echo”,#包名,与NPM服务器保持唯一
“version”: “1.0.0”,#当前版本号
“dependencies”:{
“argv”: “0.0.2”
},
“main”: “./lib/echo.js”,
“bin”: {
“node-echo”: “./bin/node-echo” #命令行程序名和主模块位置
}
}
然后,在package.json所在目录下运行npm publish 发布代码。
- 8.4 版本号
使用npm下载或者发布代码都要用到版本号。
语义版版本号分为X.Y.Z三位,
分别为主版本号、(大变动,向下不兼容)
次版本号(新增功能,向下兼容)、
补丁版本号(修复bug)。
九、最后npm比较有用的命令行:
- 在package.json目录,npm install . -g 可先在本地安装当前命令行程序,用于发布前本地测试。
- npm update
当前目录下node_modules子目录下对应模块更新到最新版本。 - npm update
-g 把全局安装的对应命令行程序更新至最新版。 - npm cache clear 清空NPM本地缓存,用于对于使用相同版本号发布新版本的人。
- npm unpublish
@ 可以撤销自己发布过的某个版本代码。
参考:
七天学会NodeJS:http://nqdeng.github.io/7-days-nodejs/\#3.2.1
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)