node.js模块和包
生活随笔
收集整理的這篇文章主要介紹了
node.js模块和包
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
概念:模塊(Module)和包(Package)是Node.js最重要的支柱。開發(fā)一個(gè)具有一定規(guī)模的程序不可能只用一個(gè)文件,通常需要把各個(gè)功能拆分、分裝、然后組合起來。模塊正式為了實(shí)現(xiàn)這種方式而誕生,在瀏覽器JavaScript中,腳本模塊的拆分和組合通常使用HTML的script標(biāo)簽來實(shí)現(xiàn),Node.js提供了require函數(shù)來調(diào)用其他模塊,而且模塊都是基于文件,機(jī)制非常簡單,模塊和包的區(qū)別是透明的,因此經(jīng)常不作區(qū)分。
????????一、模塊
????????????1.什么是模塊
Ryan 模塊和文件是一一對(duì)應(yīng)的。一個(gè)Node.js文件就是一個(gè)模塊,這個(gè)文件可能是JavaScript代碼、JSON或者編譯過的C/C++擴(kuò)展。 var http=require('http'),其中http是Node.js的一個(gè)核心模塊,通過require函數(shù)獲取這個(gè)模塊,然后使用其中的對(duì)象????????????2.創(chuàng)建及加載模塊
?????????????????(1)創(chuàng)建模塊
Node.js提供了exports和require兩個(gè)對(duì)象,其中exports是模塊公開的接口,require用于從外部獲取一個(gè)模塊的接口,即獲取模塊的exports對(duì)象 附件module.js和getModule.js的實(shí)現(xiàn) 案例: module.js: var name; exports.setName=function(thyName){name=thyName; } exports.sayHello=function(){console.log('hello'+name); } getModule.js: var myModule=require('./module'); myModule.setName('marico'); myModule.sayHello();????????????????(2)單次加載
上面的例子有點(diǎn)類似創(chuàng)建一個(gè)對(duì)象,但實(shí)際上和對(duì)象又有本質(zhì)的區(qū)別,因?yàn)?span style="color:#ff0000">require不會(huì)重復(fù)加載模塊,也就是說無論調(diào)用多少次require,獲取的模塊都是同一個(gè) getModule2.js var myModule1=require('./module'); myModule1.setName('marico'); var myModule2=require('./module'); myModule2.setName('yfc'); myModule1.sayHello();????????????????(3)覆蓋exports
有時(shí)我們知識(shí)想把一個(gè)對(duì)象封裝到模塊中,例如 定義模塊:singleobejct.js 引入模塊使用:getSingleObject.js 繁瑣:exports.hello=hello; 引入:require("./singleobject").hello; 簡易:module.exports=hello; exports本身僅僅是一個(gè)普通的空對(duì)象,即{},它是專門用來聲明接口 案例: singleobject..js function hello(){var name;this.setName=function(thyName){name=thyName;}this.sayHello=function(){console.log('hello '+name);} } //exports.hello=hello; module.exports=hello; getSingleObject.js var hello=require('./singleobject'); var he=new hello(); he.setName('marico'); he.sayHello(); var he2=new hello(); he2.setName('yfc'); he2.sayHello();????????二、創(chuàng)建包
???????????1.包的概念
包是在模塊基礎(chǔ)上更深一步的抽象,Node.js的包類似于C/C++的函數(shù)庫或者java的類庫,它講某個(gè)獨(dú)立的功能封裝起來,用于發(fā)布、更新、依賴管理的版本控制。開發(fā)了npm來解決包的發(fā)布和獲取需求。???????????2.如何創(chuàng)建一個(gè)包
????????????????CommonJS規(guī)范的包應(yīng)該具備一下特征:
package.json必須在包的頂層目錄下 二進(jìn)制文件應(yīng)該在bin目錄下 javaScript代碼應(yīng)該在lib目錄下 文檔應(yīng)該在doc目錄下 單元測試應(yīng)該在test目錄下 Node.js對(duì)包要求并沒有那么嚴(yán)格,只要頂層目錄下有package.json,并符合基本規(guī)范即可?????????????????(1)作為文件夾的模塊
somepackage文件夾 最簡單的包,就是一個(gè)作為文件夾的模塊, 創(chuàng)建一個(gè)文件夾 somepackage,里面有一個(gè)index.js,里面提供一個(gè)方法sayHello() var somepackage=require('./somepackage'); somepackage.sayHello(); 我們使用這種方法可以把文件夾封裝成一個(gè)模塊,即所謂的包。包通常是一些模塊的集合,在模塊的基礎(chǔ)上提供了更高層的抽象,相當(dāng)于提供了一些固定接口的函數(shù)庫,通過定制package.json,我們可以創(chuàng)建更復(fù)雜、更完善、更符合規(guī)范的包用于發(fā)布。 package.js exports.say=function(){ console.log(" test package!"); } test01.js var mymodule=require('/源碼/05/package/lib/package.js'); console.log(mymodule.say());????????????????????(2)package.json
前面的例子,在somepackage文件夾下,我們創(chuàng)建一個(gè)package.json的文件,內(nèi)容 { 'main':'./lib/index.js' } Node.js在調(diào)用某個(gè)包時(shí),會(huì)檢查包中package.json文件的main字段,將其作為包的接口模塊,如果package.json或main字段不存在,會(huì)常事尋找index.js或index.code作為包的接口????????????????????package.json的規(guī)范屬性:
name:包的名稱,必須是唯一 description:包的簡要說明 version:符合語義化版本識(shí)別規(guī)范的版本字符串 keywords:關(guān)鍵字?jǐn)?shù)據(jù),通常用于搜索 maintainers:維護(hù)者數(shù)組,每個(gè)元素要包含name、email、web可選字段 contributors:貢獻(xiàn)者數(shù)組,格式與maintainers相同。包的坐著應(yīng)該是貢獻(xiàn)者數(shù)據(jù)的第一個(gè)元素 bugs:提交bug的地址,可以是網(wǎng)址或者電子郵件地址 licenses:許可證數(shù)組,每個(gè)元素要包含type和url字段 repositories:倉庫托管地址數(shù)組,每個(gè)元素要包含type、url和path字段 dependencies:包的依賴,一個(gè)關(guān)聯(lián)數(shù)組,由包名稱和版本號(hào)組成。總結(jié)
以上是生活随笔為你收集整理的node.js模块和包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 扩展的欧几里得算法
- 下一篇: hdu3530Subsequence【单