四、模块系统
什么是模塊化
- 文件作用域(模塊是獨立的,在不同的文件使用必須要重新引用)【在node中沒有全局作用域,它是文件模塊作用域】
- 通信規則
- 加載require
- 導出exports
CommonJS模塊規范
在Node中的JavaScript還有一個重要的概念,模塊系統。
-
模塊作用域
-
使用require方法來加載模塊
-
使用exports接口對象來導出模板中的成員
加載require
語法:
var 自定義變量名 = require('模塊')作用:
- 執行被加載模塊中的代碼
- 得到被加載模塊中的exports導出接口對象
導出exports
-
Node中是模塊作用域,默認文件中所有的成員只在當前模塊有效
-
對于希望可以被其他模塊訪問到的成員,我們需要把這些公開的成員都掛載到exports接口對象中就可以了
導出多個成員(必須在對象中):
exports.a = 123; exports.b = function(){console.log('bbb') }; exports.c = {foo:"bar" }; exports.d = 'hello';導出單個成員(拿到的就是函數,字符串):
module.exports = 'hello';以下情況會覆蓋:
module.exports = 'hello'; //后者會覆蓋前者 module.exports = function add(x,y) {return x+y; }也可以通過以下方法來導出多個成員:
module.exports = {foo = 'hello',add:function(){return x+y;} };
模塊原理
exports和module.exports的一個引用:
console.log(exports === module.exports); //trueexports.foo = 'bar';//等價于 module.exports.foo = 'bar';當給exports重新賦值后,exports!= module.exports.
最終return的是module.exports,無論exports中的成員是什么都沒用。
真正去使用的時候:導出單個成員:exports.xxx = xxx;導出多個成員:module.exports 或者 modeule.exports = {}; 1.jQuery中的each 和 原生JavaScript方法forEach的區別:提供源頭:原生js是es5提供的(不兼容IE8),jQuery的each是jQuery第三方庫提供的(如果要使用需要用2以下的版本也就是1.版本),它的each方法主要用來遍歷jQuery實例對象(偽數組),同時也可以做低版本forEach的替代品,jQuery的實例對象不能使用forEach方法,如果想要使用必須轉為數組([].slice.call(jQuery實例對象))才能使用 2.模塊中導出多個成員和導出單個成員 3.301和302的區別:301永久重定向,瀏覽器會記住302臨時重定向 4.exports和module.exports的區別:每個模塊中都有一個module對象module對象中有一個exports對象我們可以把需要導出的成員都掛載到module.exports接口對象中也就是`module.exports.xxx = xxx`的方式但是每次寫太多了就很麻煩,所以Node為了簡化代碼,就在每一個模塊中都提供了一個成員叫`exports``exports === module.exports`結果為true,所以完全可以`exports.xxx = xxx`當一個模塊需要導出單個成員的時候必須使用`module.exports = xxx`的方式,=,使用`exports = xxx`不管用,因為每個模塊最終return的是module.exports,而exports只是module.exports的一個引用,所以`exports`即使重新賦值,也不會影響`module.exports`。有一種賦值方式比較特殊:`exports = module.exports`這個用來新建立引用關系的。require的加載規則
-
核心模塊
- 模塊名
-
第三方模塊
- 模塊名
-
用戶自己寫的
- 路徑
require的加載規則:
-
優先從緩存加載
-
判斷模塊標識符
- 核心模塊
- 自己寫的模塊(路徑形式的模塊)
- 第三方模塊(node_modules)
- 第三方模塊的標識就是第三方模塊的名稱(不可能有第三方模塊和核心模塊的名字一致)
- npm
- 開發人員可以把寫好的框架庫發布到npm上
- 使用者通過npm命令來下載
- 使用方式:var 名稱 = require('npm install【下載包】 的包名')
- node_modules/express/package.json main
- 如果package.json或者main不成立,則查找被選擇項:index.js
- 如果以上條件都不滿足,則繼續進入上一級目錄中的node_modules按照上面的規則依次查找,直到當前文件所屬此盤根目錄都找不到最后報錯
總結
- 上一篇: 六、Numpy的使用(详解)
- 下一篇: 指令系统——数据寻址(3)——堆栈寻址(