node.js整理 01代碼的組織和部署

模塊

require(函數)

  • 用於在當前模塊中加載和使用別的模塊,傳入一個模塊名,返回一個模塊導出對象。
  • 模塊名可以使用相對路徑(以./開頭),或者是絕對路徑(以/或C:之類的盤符開頭;注意單個模塊名默認指向node_modules文件)。
  • 模塊名中的.js擴展名能夠省略。
  • 能夠加載和使用一個JSON文件。

exports(對象)

  • 當前模塊的導出對象,用於導出模塊公有方法和屬性。
  • 別的模塊經過require函數使用當前模塊時獲得的就是當前模塊的exports對象。

module(對象)

  • 經過module對象能夠訪問到當前模塊的一些相關信息,但最多的用途是替換當前模塊的導出對象。
  • 如將模塊導出對象改爲一個函數
module.exports = function () {
    console.log('Hello World!');
};

模塊初始化

  • NodeJS使用CMD模塊系統
  • 一個模塊中的JS代碼僅在模塊第一次被使用時執行一次,並在執行過程當中初始化模塊的導出對象。以後,緩存起來的導出對象被重複利用。
var counter1 = require('./util/counter');
var  counter2 = require('./util/counter');

//counter1和counter2是同樣的

主模塊

  • 經過命令行參數傳遞給NodeJS以啓動程序的模塊被稱爲主模塊。
  • 主模塊負責調度組成整個程序的其它模塊完成工做

二進制模塊

  • 通常使用JS編寫模塊,但NodeJS也支持使用C/C++編寫二進制模塊。
  • 編譯好的二進制模塊除了文件擴展名是.node外,和JS模塊的使用方式相同。

模塊路徑解析規則

  • 內置模塊: 若是傳遞給require函數的是NodeJS內置模塊名稱,不作路徑解析,直接返回內部模塊的導出對象,例如require('fs')node

  • node_modules目錄: NodeJS定義了一個特殊的node_modules目錄用於存放模塊。例如某個模塊的絕對路徑是/home/user/hello.js,在該模塊中使用require('foo/bar')方式加載模塊時,則NodeJS依次嘗試使用如下路徑。linux

/home/user/node_modules/foo/bar
 /home/node_modules/foo/bar
 /node_modules/foo/bar
  • NODE_PATH環境變量: 與PATH環境變量相似,NodeJS容許經過NODE_PATH環境變量來指定額外的模塊搜索路徑。NODE_PATH環境變量中包含一到多個目錄路徑,路徑之間在Linux下使用:分隔,在Windows下使用;分隔。例如定義瞭如下NODE_PATH環境變量:
NODE_PATH=/home/user/lib:/home/lib

當使用require('foo/bar')的方式加載模塊時,則NodeJS依次嘗試如下路徑。shell

/home/user/lib/foo/bar
/home/lib/foo/bar

包(package)

index.js

  • 若是在導入文件的時候沒有指明文件名,默認加載index.js文件
//node/person/index.js

var head = require('./head');
var body = require('./body');

exports.create = function(name) {
  return {
    name: name,
    head: head.create,
    body: body.create
  }
};

//node/main.js

var index = require('./lib');

這樣將person當作一個包
  • package.json

*若是cat文件夾中package.json文件這樣定義,在以前的狀況,就會優先加載main指定的文件;npm

{
  "name": "cat",
  "main": "./main"
}

命令行程序

  • 在任何目錄下都能像是一個命令行程序運行程序

Linux系統下設置(以路徑/home/user/bin/node-echo.js爲例)

  • 在shell腳本中,能夠經過#!註釋來指定當前腳本使用的解析器。因此首先在node-echo.js文件頂部增長如下一行註釋,代表當前腳本使用NodeJS解析。
#! /usr/bin/env node

NodeJS會忽略掉位於JS模塊首行的#!註釋json

  • 而後,使用如下命令賦予node-echo.js文件執行權限。
$ chmod +x /home/user/bin/node-echo.js
  • 最後,在PATH環境變量中指定的某個目錄下,例如在/usr/local/bin下邊建立一個軟鏈文件,文件名與但願使用的終端命令同名,命令以下:
$ sudo ln -s /home/user/bin/node-echo.js /usr/local/bin/node-echo

這樣處理後,就能夠在任何目錄下使用node-echo命令。windows

Windows設置

  • 假設node-echo.js存放在C:\Users\user\bin目錄,而且該目錄已經添加到PATH環境變量裏了。

*接下來須要在該目錄下新建一個名爲node-echo.cmd的文件,文件內容以下:緩存

@node "C:\User\user\bin\node-echo.js" %*

工程目錄

一個標準的工程目錄

- /home/user/workspace/node-echo/   # 工程目錄
    - bin/                          # 存放命令行相關代碼
        node-echo
    + doc/                          # 存放文檔
    - lib/                          # 存放API相關代碼
        echo.js
    - node_modules/                 # 存放三方包
        + argv/
    + tests/                        # 存放測試用例
    package.json                    # 元數據文件
    README.md                       # 說明文件

NPM

同NodeJS一塊兒安裝的包管理工具,能解決NodeJS代碼部署上的問題,常見的使用場景:

  • 容許用戶從NPM服務器下載別人編寫的三方包到本地使用: npmjs.org包名搜索服務器

  • 容許用戶從NPM服務器下載並安裝別人編寫的命令行程序到本地使用: 方法與三方包相似函數

  • 容許用戶將本身編寫的包或命令行程序上傳到NPM服務器供別人使用: 第一次使用NPM發佈代碼前須要註冊一個帳號。終端下運行npm adduser,以後按照提示作便可;工具

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"      # 命令行程序名和主模塊位置
    }
}

以後,就能夠在package.json所在目錄下運行npm publish發佈代碼。

版本號: 語義版本號分爲X.Y.Z三位,分別表明主版本號、次版本號和補丁版本號。當代碼變動時,版本號按如下原則更新。

  • 若是隻是修復bug,須要更新Z位。

  • 若是是新增了功能,可是向下兼容,須要更新Y位。

  • 若是有大變更,向下不兼容,須要更新X位。

在申明三方包依賴時,除了可依賴於一個固定版本號外,還可依賴於某個範圍的版本號。

其餘命令

  • npm help <command>可查看某條命令的詳細幫助。

  • 在package.json所在目錄下使用npm install . -g可先在本地安裝當前命令行程序,可用於發佈前的本地測試。

  • npm update <package>能夠把當前目錄下node_modules子目錄裏邊的對應模塊更新至最新版本。

  • 使用npm update <package> -g能夠把全局安裝的對應命令行程序更新至最新版。

  • 使用npm cache clear能夠清空NPM本地緩存,用於對付使用相同版本號發佈新版本代碼的人。

  • 使用npm unpublish <package>@<version>能夠撤銷發佈本身發佈過的某個版本代碼。

相關文章
相關標籤/搜索