首頁  >  文章  >  web前端  >  淺談Nodejs中的模組規範

淺談Nodejs中的模組規範

青灯夜游
青灯夜游轉載
2021-06-09 10:47:181870瀏覽

本篇文章給大家詳細了解一下Nodejs中的模組規格。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

淺談Nodejs中的模組規範

模組規範是建立一個大型 Node.js 應用的基礎,所以非常重要;Node.js 模組規範也就是 CommonJS 模組規範,下面來簡單了解一下吧。 【推薦學習:《nodejs 教學》】

CommonJS 模組規格

先前載入JS 檔案的唯一方式是透過 標籤引入,這會有什麼問題呢?

  • 腳本變多時,需要手動管理載入的順序;腳本越多就越難管理。
  • 不同腳本之間的邏輯調用,需要透過全域變數的方式。
  • 沒有 html 的時候怎麼引用 JS 檔呢?這個例子就是 Node.js。

於是 Node.js 就有了 CommonJS 模組規範,而 Webpack 也是相容了 CommonJS 的寫法,讓我們可以用 CommonJS 規格來寫前端程式碼。

CommonJS 模組規格是由 JavaScript 社群發起的,它在 Node.js 上被應用並推廣,後續也影響了瀏覽器端 JavaScript。

require

require 是 CommonJS 模組規範的 API,用來引入要使用的檔案。例如引入lib.js

require('./lib');

require 預設回傳一個空物件;新建兩個文件,檔案內容如下:

// lib.js
console.log('this is lib');

// index.js
console.log('start require')
var lib = require('./lib'); // 默认返回一个空对象
console.log('end require', lib);

來執行看看:node index.js

淺談Nodejs中的模組規範

它也是可以透過exports 來掛載一些屬性的:字串、函數、物件等類型的資料。

lib.js 增加一些程式碼

console.log('this is lib')

exports.hello = "world"
exports.add = function (a, b) {
  return a + b;
}
exports.obj = { hello: "Node" }

淺談Nodejs中的模組規範

#看來在CommonJS 模組規格下,它是預設有一個exports 這樣的空物件的。

那既然 require 傳回這樣一個對象,那麼修改和加入其中的屬性會怎麼樣呢?

// index.js
// 既然 require 返回一个对象,那么修改和添加属性会怎么样呢?
lib.hello = 'node';
lib.update = '1234';
// lib.js
setTimeout(function() {
  console.log(exports)
}, 500)

淺談Nodejs中的模組規範

可以看到,在 lib.js 加了一個 500ms 之後列印的內容是改變了的。所以透過 exports 輸出的時候要注意這個拷貝的問題。或許有些同學會看過這樣的一段話:CommonJS 模組輸出的是一個值的淺拷貝,ES6 模組輸出的是值的引用。那麼這是怎麼回事呢?

原來require 也可以透過module.exports 的方式回傳數據,而且資料型別是不限的,例如傳回一個函數:

// lib.js
console.log('this is lib')

exports.hello = "world"
exports.add = function (a, b) {
  return a + b;
}
exports.obj = { hello: "Node" }
// setTimeout(function() {
//   console.log(exports)
// }, 500)
module.exports = function minus(a, b) {
  return a - b;
}

淺談Nodejs中的模組規範

可以看到:lib 傳回輸出的minus 函數。

require 一個模組時,module.exports 的優先權要高於exports,如果指定了module.exports,那麼就會使用module.exports 指定的對象,如果沒有指定module.exports,就會使用exports 物件。

npm

npm 相信大家都不陌生,那這裡就只是簡單介紹一下吧。

npm 是 Node.js 的套件管理工具,安裝 Node.js 的時候都會自有 npm 的。而套件則是別人寫的 Node.js 模組,我們平常開發都會常用到一些別人開發出來放到 Node.js 伺服器上面的套件。

npm 初始化:npm init,初始化的時候一直回車就好,之後會產生一個package.json 檔案;或是執行指令npm init -y,這樣就是產生一個預設的package.json 文件,裡面的屬性和執行npm init 一直回車是一樣的。

淺談Nodejs中的模組規範

package.json 檔案內容如下:

{
  "name": "node",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
  • 下载安装依赖包 <packagename></packagename>npm install <packagename></packagename>;如果想要全局安装则添加 -gnpm install <packagename> -g</packagename>。如安装 glob 包:npm install glob
  • 卸载依赖包的命令是 npm uninstall <packagename></packagename>

比如安装 express 包,安装成功会生成一个 node-modules 文件夹,我们下载的包就放在这个文件里面:

淺談Nodejs中的模組規範

如果使用 npm 安装依赖包的速度很慢,可以使用淘宝镜像 cnpm 来安装,镜像是指它把国外 npm 的包做一层复制然后映射到国内的服务器上面,这样不用山长水远去国外拉包,速度会快很多。

安装 cnpm

npm install -g cnpm --registry=https://registry.npm.taobao.org

cnpm 的使用和 npm 类似:cnpm install <packagename></packagename>

那如果你觉得 cnpm 不够正宗,不想长期使用,但有些包下载又确实慢了,可以临时使用镜像,比如安装 express

npm install express --registry=https://registry.npm.taobao.org

--registry= 是指定下载地址的意思,例如一些公司可能有自己的依赖包服务器,那么可以通过将这个地址指向公司的服务器地址来更快的下载依赖包。

cnpm 本身其实是 npm 的一个别名,使用 cnpm 的时候会自动帮我们加上后面的参数 --registry=https://registry.npm.taobao.org,然后通过镜像地址来下载依赖包。

另外,npm 使用遇到问题可以登录 官网 寻找解决办法:

淺談Nodejs中的模組規範

总结

  • Node.js 的模块规范就是 CommonJS 模块规范。
  • CommonJS 模块规范通过 require() 加载模块,默认返回一个对象,可以通过设置 exportsmodule.exports 设置模块返回的数据。
  • Node.js 的包管理工具是 npm,可通过使用镜像 cnpm 来提高下载速度。

更多编程相关知识,请访问:编程视频!!

以上是淺談Nodejs中的模組規範的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除