Nodejs的模塊化

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的核心模塊

  • 使用核心模塊以前首先要導入模塊javascript

  • path模塊html

    • 導入模塊 var path = require("path");
    • basename() 獲取文件名+後綴java

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

      path.dirname("/foo/hello/world/123.html")
    • extname() 獲取文件的擴展名git

      path.extname("/foo/hello/world/123.html")
    • join() 合併路徑程序員

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

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

      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模塊npm

    • 導入模塊 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":"xxxxx@qq.com"
        }]
      • npm cache clear 清除npm本地緩存,用於對使用相同版本號發佈新版本
      • npm unpublish @ 刪除發佈過的版本代碼 npm unpublish haha@1.0.0
  • 錯誤

  • 安裝包

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

    • 優先從緩存加載模塊或者包
    • 加載文件模塊要使用相對路徑 ./ ../
    • 文件模塊的加載能夠不寫後綴名,若是不寫後綴名按照 .js > .node > .json的順序加載
    • 加載json文件,推薦寫上後綴.json
    • 加載核心模塊或包,不寫路徑和後綴
    • module.paths 加載node_modules的時候,按此數組的順序加載
相關文章
相關標籤/搜索