本篇文章介紹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中的內容。