nodejs快速入門(三)-模塊引入與加載機制

        本篇文章介紹nodejs的模塊引入與加載機制。

(一)模塊引入與常用內置對象

    1、module

        nodejs認爲一個js文件就是一個模塊,每個模塊都有一個全局對象module,同時module對象中有一個對象exports。

 這個對象被加載一次之後會別緩存,裏面提供了模塊的父子模塊關聯信息,即父模塊被那些模塊引用,子模塊引用了那些模塊。

    Module {
              id: '.',
              exports: {},
              parent: null,
              filename: 'E:\\workspace\\myRequre.js',
              loaded: false,
              children: [],

              paths: [ 'E:\\workspace\\ node_modules', 'E:\\workspace\\node_modules', 'E:\\node_modules' ] 

        }

2、exports

    exports是module.exports對象的別名,提供便捷的屬性和方法設置。如

    exports.add = function(v1,v2){ return v1 + v2;} 模塊中的module.exports對象就增加了add方法。

3、require

    require可以加載文件模塊(.js、.code、.json)和nodejs核心模塊,最終獲取到的是module.exports對象。第一次加載的時候執行代碼,第二次從緩存中獲取module.exports對象,如果沒有發現指定模塊就報錯not find module。

下面模擬require對象:

myRequire.js

function MyRequre(path){

	function Module(){
		this.exports = {};
	}

	var fs = require('fs');

	var source = fs.readFileSync(path,'utf8');

	var package = "(function(exports,module){"+source+" return module.exports;})";

	var callback = eval(package);

	var module = new Module();
	var fn  = callback(module.exports, module);

	return fn;
}

fnModule.js

module.exports=function(){
	return 123;
};

調用

var fn = MyRequre('./foo.js');
console.log(fn());

結果:123

4、nodejs的核心模塊

核心模塊的源碼都在lib子目錄中,爲了提高運行速度,他們按照的時候,都會被編譯成二進制文件。

模塊加載機制

        ①

5、package

   包是將一堆的文件聯繫起來的一種機制,nodejs就是在模塊的基礎之上進一步組織javascript代碼。

    

  規範的包目錄結構  

文件/目錄 說明
package.json     包描述文件,不僅開發者閱讀使用,nodejs也使用
bin 存放可執行的文件目錄
lib 存放JavaScript的目錄
doc 存放文檔目錄
test 單元測試用例代碼

package.json文件,如

{
  "name": "test",
  "version": "0.0.1",
  "description": "",
  "main": "index.js",
  "keywords": [
  ],
  "author": "KingNigel",
  "repository": {
    "type": "git",
    "url": "https://github.com/KingNigel/test.git"
  },
  "bugs": {
    "url": "https://github.com/KingNigel/test/issues"
  },
  "license": "MIT",
  "devDependencies": {
    "express": "4.*"
  },
  "dependencies": {
    "express": "4.*"
  }
}
屬性 描述
name 包名
description 包簡介
version 包版本號
keywords 關鍵詞組,在npm中分類搜索使用
author 包作者
main 配置包入口,默認是根目錄下index.js
dependencies 包依賴項,npm會自動加載依賴包
scripts 指定運行腳本命令npmn命令行

5、npm

    全球最大的第三方模塊生態系統(http://www.npmjs.com),package是一個規範,npm是實現,作用是暗裝和管理node模塊。

基礎使用命令

        npm install 包名 —— 當執行該命令時,回到npm網站找到github地址,下載壓縮包,並加壓。然後,在npm當前目錄下查找node_modules目錄,將解壓文件放到該目錄下,如果沒有找打該目錄就創建。

        npm install -g 包名 —— 表示全局全裝,npm會設置一個按照目錄,將包放到該目錄中,並提供命令行工具。

        npm i -S  包名@版本號 —— 添加依賴項到package.json文件的denpendencies字段中, 生產環境使用。

        npm i -D 包含@版本號 —— 添加依賴項到package.json文件的devDenpendencies字段中,開發環境使用。

        npm config set prefix —— 修改全局按照目錄,不建議使用,建議到npm目錄下的.npmrc文件中修改 prefix = 安裝目錄,在windows的全局環境path中把按照目錄配置進去。

 

6、文件操作

    ①箭頭函數  ECMAScript6.0 支持的一種函數語法

        函數有一個參數,有返回值寫法: var fn = v => v ;第一個v表示參數 ,第二個v表示返回值。

        函數沒有參數,有返回值 var fn = () => v 

        函數有多個參數,有返回值 var fn = (v1,v2) => {return v1 + v2}

        函數有多個參數,沒有返回值 var fn = (v1,v2) => {console.log(v1); console.log(v2)}

        

    ②fs文件讀寫

           fs是nodejs的一個核心模塊,用於讀文件操作。內部的方法一般都是成對出現的,分爲同步和異步。

    (1)fs.readFile(filepath, [options], callback)

            filepath 文件路徑

            options可選參數,object {"encoding":"uft8","flag":"r"} ,一般使用“utf8”

            callback = function(err,data){} 參數err:表示讀文件錯誤時的返回的錯誤信息,默認值爲null;data表示讀文件成功返回的數據,默認值爲undefined。

           var data = fs.readFileSync(filepath,[options])     此方法爲異步方法, 直接返回數據。

    (2)fs.access(path,[mode], callback) 判斷文件是否存在

            model一般不用寫; callback= function(err){} 只有一個err參數。

模擬fs讀文件操作

        在node_modules目錄中創建一個readf文件夾,該文件夾目錄中創建一個package.json

{
  "name": "readf",
  "version": "0.0.1",
  "description": "",
  "main": "readf.js",
  "keywords": [
  ],
  "author": "KingNigel",
  "repository": {
    "type": "git",
    "url": "https://github.com/KingNigel/test.git"
  },
  "bugs": {
    "url": "https://github.com/KingNigel/test/issues"
  },
  "license": "MIT",
  "devDependencies": {
    "express": "4.*"
  },
  "dependencies": {
    "express": "4.*"
  }
}

    再創建一個read.js文件

var fs=require('fs');

var rf=function(path,callback){

fs.access(path, (err) => {
   if(err){
      callback(err);
   }
    fs.readFile(path,'utf8',(err,data)=>{
        callback(null,data)
    })
});
}
module.exports=rf;

在node_modules的同級目錄下創建一個test.js

var fr = require("readf");

fr("./package.json",function(err,data){
	console.log(data);
});

結果就是package.json中的內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章