Nodejs的模組化

來源:互聯網
上載者:User

標籤:應用   cti   說明   cap   思想   副檔名   .exe   組織   exit   

1. Node.js中的模組化簡介
  • 為什麼Node.js中需要模組化
      在後台開發語言中,比如Java、C#。他們都是隱含模組化的,Node.js預設幫我們提供了模組化這種機制。  在伺服器端,我們想要使用底層的一些功能需要匯入一些“包”來對其操作,比如操作檔案、網路需要匯入對應的包。其它語言中都是基於類來實現的模組化的思想,使用類來組織檔案和檔案之間的關聯。  而Node.js中使用的是JavaScript語言,ECMAScript僅僅規定了基本的文法的書寫,並沒有規定檔案之間關聯,也就是說每個js檔案之間是獨立的,Node.js已經幫我們實現了js檔案之間的關聯(模組化)  Node.js中的模組化是基於CommonJS規範的
  • JavaScript的局限性
    • 沒有模組系統
    • 系統提供的介面較少,比如:缺少操作檔案、I/O流等常用的介面
    • 沒有標準介面,缺少如web伺服器、資料庫等統一介面
    • 缺乏管理系統導師JavaScript應用中基本沒有自動載入和安裝依賴的能力
  • CommonJS規範
    • Node.js開發之初遵守了CommonJS規範
    • 使JavaScript達到像Java、Python、PHP等語言一樣有開發大型應用的基本能力
    • CommonJS規範規定每一個模組都有一個單獨的範圍
    • CommonJS規範規定每個模組對外公布的成員使用module.exports或者exports
    • 有了模組化系統之後,Node.js提供了許多系統模組:檔案、Buffer、I/O流、Socket等
2. Node.js的核心模組
  • 使用核心模組之前首先要匯入模組

  • path模組

    • 匯入模組 var path = require("path");
    • basename() 擷取檔案名稱+尾碼

          path.basename("/foo/hello/world/123.html")    //第二個參數,去掉擷取的檔案名稱中的相同部分    path.basename("c:/foo/hello/world/123.html",".html")
    • dirname() 擷取目錄

         path.dirname("/foo/hello/world/123.html") 
    • extname() 擷取檔案的副檔名

        path.extname("/foo/hello/world/123.html") 
    • join() 合并路徑

           var p1 = "c://abc/xyz";     var p2 = "/123/456";     console.log(path.join(p1,p2));
    • parse() 把路徑轉換為一個對象

        path.parse("c:\\home\\hello\\world\\123.html")  { root: ‘c:/‘,    dir: ‘c://home/hello/world‘,    base: ‘123.html‘,    ext: ‘.html‘,    name: ‘123‘ }
    • format() 把一個路徑對象轉換成一個路徑字串

        var obj = { root: ‘c:\\‘,      dir: ‘c:\\home\\hello\\world‘,      base: ‘123.html‘,      ext: ‘.html‘,      name: ‘123‘ }  console.log(path.format(obj));
    • delimiter 環境變數的分隔字元,可以跨平台 windows下是; 其它平台 :

    • path.sep 路徑的分隔字元 windows下是\ 其它下是/
    • isAbsolute() 是否是絕對路徑
  • url模組

    • 匯入模組 var url = require("url");
    • parse() 把字串的路徑轉換成對象

        var uri = "http://www.baidu.com:8080/images/1.jpg?version=1.0&time=1123#abcd";  console.log(url.parse(uri));
    • format() 把路徑對象轉換成字串

        var obj =  {      protocol: ‘http:‘,      slashes: true,      auth: null,      host: ‘www.baidu.com:8080‘,      port: ‘8080‘,      hostname: ‘www.baidu.com‘,      hash: ‘#abcd‘,      search: ‘?version=1.0&time=1123‘,      query: ‘version=1.0&time=1123‘,      pathname: ‘/images/1.jpg‘,      path: ‘/images/1.jpg?version=1.0&time=1123‘,      href: ‘http://www.baidu.com:8080/images/1.jpg?version=1.0&time=1123#abcd‘ };  var str = url.format(obj);  console.log(str);
  • querystring模組

    • 匯入模組 var querystring = require("querystring");
    • parse() 把參數字串解析成對象

        var obj = querystring.parse("version=1.0&time=123");  console.log(obj);
    • stringify() 把一個對象轉換成一個字串
    • escape() url進行編碼
    • unescape() url進行解碼
3. 核心模組存在哪裡?
  • 核心模組儲存在node.exe中,當node.exe啟動並執行時候,核心模組會被載入,require的時候會載入到記憶體
  • 在github上可以找到原始碼,lib檔案夾下
  • 核心模組的執行速度比較快
4. 檔案模組(自訂模組)
  • 定義檔案模組 add.js

              function add(a,b) {              return a + b;          }          //匯出成員          exports.add = add;          //module.exports.add = add;
  • 使用檔案模組 main.js

              var obj = require("./add.js");          console.log(obj.add(5,6));
    • 注意引用js的方式和核心模組不同
            //使用相對於main.js 的方式尋找add.js      var obj = require("./add.js");      var obj = require("./add");      //下面這種方式是引用核心模組或者包      //var obj = require("add");
5. 包
  • CommonJS的包規範給程式員提供了組織模組的標準,減少溝通成本

  • 包的使用:

    • 所有模組放在一個檔案夾(包名)
    • 包放在當前項目中的node_modules檔案夾下
    • 包中定義一個index.js(檔案名稱不可以更改)匯出所有模組
    • 引用包(約定大於配置)
  • 匯入包的執行過程 require("calc")

    • 將calc當做核心模組載入,載入不成功
    • 自動去目前的目錄中的node_modules中找檔案名稱為calc的包
    • 自動去calc找index.js的出口模組(匯出的模組)
    • 如果找不到index.js報錯,如果想要改出口模組,需要package.json設定檔
  • package.js

名稱 功能
name 包名稱
description 包介紹,介紹包的功能
version 版本號碼,用於版本控制
keywords 關鍵詞數組,用於在npm中搜尋
main require引入包時優先檢查此欄位
dependencies 標記當前包所依賴的包列表,npm會自動載入依賴的包
Author 包作者
License 開源許可
{  "name": "calcpack",   "version": "1.0.0",  "description": "",  "main": "app.js",  "scripts": {   //可以通過npm run來執行    "test": "echo \"Error: no test specified\" && exit 1"  },  "keywords": [],  "author": "",  "license": "ISC"}
  • 建立包的標準方式

    • npm init -y 自動建立package.json
  • 一個標準包的結構

名稱 |功能 |---|---| package.js |包描述檔案 bin |存放可執行檔 lib |存放JavaScript代碼 doc |存放文檔 test |存放單元測試用例代碼 README.md |說明文檔,描述包的作用和用法

  • 標準包執行過程
    • 將calcpack當做核心模組載入,載入不成功
    • 自動去目前的目錄中的node_modules中找檔案名稱為calcpack的包
    • 如果在calcpack中有package.json的話,並且指定了main屬性的值,優先載入main指定的.js模組(出口模組)
    • 如果沒有package.json,或沒有指定main屬性,自動去calcpack找index.js的出口模組(匯出的模組)
    • 如果找不到index.js報錯
6. 發布包
  • 把包發布到NPM官網 https://www.npmjs.com/

    • 建立一個包,設定package.json
    • 在npmjs中註冊帳號
    • 在包的根目錄下執行
      • npm adduser 添加發布包的使用者資訊,登入網站
      • npm publish 發布或者更新包 package.json中一定要指定 maintainers:[{
          "name":"nllcode",  "email":"[email protected]"
        }]
      • npm cache clear 清除npm本機快取,用於對使用相同版本號碼發布新版本
      • npm unpublish @ 刪除發布過的版本代碼 npm unpublish [email protected]
  • 錯誤

    • only admin can publish this module
    • 解決:修改源 npm config set registry http://registry.npmjs.org
  • 安裝包

    • 從網路安裝
      • 目前的目錄安裝 npm install 包名
      • 全域安裝 npm install 包名 -g
    • 本地安裝 npm install 包的路徑
    • 卸載包 npm uninstall 包名
  • require()載入規則

    • 優先從緩衝載入模組或者包
    • 負載檔案模組要使用相對路徑 ./ ../
    • 檔案模組的載入可以不寫尾碼名,如果不寫尾碼名按照 .js > .node > .json的順序載入
    • 載入json檔案,推薦寫上尾碼.json
    • 載入核心模組或包,不寫路徑和尾碼
    • module.paths 載入node_modules的時候,按此數組的順序載入

Nodejs的模組化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.