没耐心的NodeJS基础教程

这是一篇没耐心的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/bar

  • 4.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 ,请勿用于任何商业用途)