JavaScript 的頂層對象是window, Node的頂層對象是global
JavaScript也存在globale, 但是不對外訪問,而使用window對象指向global對象
Node.js 的global.a 得不到,是模塊的變量,不是全局變量
var?a?=?100;
//console.log(global.a);?//undefined,global是全局
console.log(a);
在Node.js中,一個文件是一個模塊,每個文件都有自己的作用域 ,使用var聲明的是當前模塊作用域的,而不是全局的。
Node.js 模塊
1. 核心模塊, Node.js提供
2. 文件模塊, 用戶編寫
核心模塊在Node源碼編譯過程,編譯為二進制文件,在Node啟動時,直接加載進內存。
文件模塊運行時動態加載,需要完整的路徑分析、文件定位、編譯,速度較慢。
模塊加載
JavaScript使用 <script>標簽, Node.js使用 require()方法引入。
前端瀏覽器會緩存靜態腳本, Node對導入的模塊也會緩存,緩存的是編譯和執行之后的對象
模塊標識:
1. 核心模塊: http、path
2. . 或 ..開始的相對路徑文件模塊
3. /開頭的絕對路徑文件模塊
4. 非路徑形式的文件模塊
當前路徑以 ./ 開頭
后綴名: 后綴名可以包含,也可以不包含。
不包含則首選查找沒有后綴的文件,在按.js .json .node依次查找。
.node 和 .json文件, 帶上擴展名,可以加快速度。
跨模塊訪問變量:
1. 將變量定義到 global中,
簡單、污染了全局環境,不推薦
2. 使用模塊對象(Module)
module.id 模塊的識別符,通常是帶有絕對路徑的模塊文件名。
module.filename 模塊的文件名,帶有絕對路徑。
module.loaded 返回一個布爾值,表示模塊是否已經完成加載。
module.parent 返回一個對象,表示調用該模塊的模塊。
module.children 返回一個數組,表示該模塊要用到的其他模塊。
module.exports 表示模塊對外輸出的值。
module.exports屬性表示當前模塊對外輸出的接口,其他文件加載該模塊,實際上就是讀取module.exports變量
//a.js
var a = 100;
m
module.exports.a = a;
//b.js
var result = require('./a');
c
console.log(result);//'{ a: 100 }'
為了方便,Node為每個模塊提供一個exports變量,指向module.exports。造成的結果是,在對外輸出模塊接口時,可以向exports對象添加方法
console.log(module.exports === exports);
模塊編譯:
不同的文件擴展名,載入方法不同:
1. js 文件, 通過 fs模塊同步讀取文件后編譯執行
2. mode文件,C/C++編寫的擴展文件, 通過dlopen()方法加載
3. json文件, 通過fs模塊同步讀取,用 JSON.parse()解析返回的結果
CommonJs、AMD、CMD、ES6模塊
JavaScript 模塊化
模塊化好處
- 獨立,維護和改動方便
- 可以重復利用
需要解決的問題:
1. 命名沖突
// a.js
var a = 1;
// b.js
var a = 2;
2. 文件依賴
<script src='a.js' type='text/javascript'></script>
<script src='b.js' type='text/javascript'></script>
如何解決沖突、依賴
1. 使用命名空間,暴露模塊所有成員
let module = {
name: '',
hello() {
console.log(this.name);
}
}
2. 立即執行函數+閉包
函數內部有自己獨立的作用域, 外部只能訪問暴露的成員
let module = (function () {
let privateName = 'private'; // 私有變量
let privateFn = function () {}; // 私有函數
// 對外暴露的成員
return {
name: '111', // 公有屬性
hello() { // 公有方法
console.log(this.name);
}
}
})();
3. 立即執行函數+類
const People = (function () {
let privateName = 'private'; // 私有變量
let fn = function () {}; // 私有方法
return class People {
constructor () {
this.name = 'likang xie'; // 公有變量
}
// 公有方法
sayName() {
console.log(this.name);
}
}
})()
- 0. 前言
- 1. 基礎篇
- Node.js 入門介紹與安裝
- Node.js運行模式與入門實例
- npm介紹及與Node.js關聯
- Webpack 快速介紹及入門示例
- 模塊
- webpack
- gulp
- 2. 進階篇
- Node.js與Apache比較
- Node.js VS JavaScript
- CommonJS、AMD、CMD與ES6
- 3. 框架篇
- Node.js之Express快速介紹與入門示例
- 4. 實戰篇
- 調試器監聽
- webpack入門示例
- 5. 補充篇
- 語法
- 前端包管理工具:npm、cnpm、yarn
- 6. 問題解決篇
- webpack之options has an unknown property ‘contentBase‘. These properties are valid: