代码组织和部署 文件操作 node.js
代碼組織和部署
模塊的路徑解析規(guī)則
require支持/或者盤符的絕對(duì)路徑,也支持./開頭的相對(duì)地址
同時(shí)require也支持第三種寫法
內(nèi)置模塊
如果傳遞給require的函數(shù)是node.js的內(nèi)置模塊,將會(huì)不做路徑解析,直接返回內(nèi)部exports模塊要導(dǎo)出的對(duì)象
node_modules目錄
node.js定義一個(gè)node_modules存放模塊,每次使用foo/bar的方式的時(shí)候,會(huì)先尋找該目錄下的node_modules,接著上一層,知道頂層為止
NODE_PATH環(huán)境變量
如果設(shè)置變量,將會(huì)按照變量的地址進(jìn)行尋找
包
包是由多個(gè)子模塊組成的大模塊為包,其中所有的子模塊都放進(jìn)同一個(gè)目錄里
index.js
當(dāng)模塊文件名為index.js的時(shí)候,加載模塊所在目錄的路徑代替模塊文件路徑
package.json
package.json能自定義入口模塊的路徑、
-/home/user/lib`cat/+ doc/- lib/head.jsbody.jsmain.js+ tests/package.json以上為一個(gè)目錄文件
配置文件內(nèi)容如下
其中定義該包的名稱為cat,入口文件為相對(duì)路徑下的main.js
即,加載該模塊的時(shí)候路徑為
node.js會(huì)自動(dòng)根據(jù)配置文件找到入口模塊所在的位置
命令行程序
為了在任何目錄實(shí)現(xiàn)
node-echo hello wordwindows
需要cmd文件,
需要先將其目錄添加到環(huán)境變量
在該目錄下創(chuàng)建cmd文件
創(chuàng)建cmd文件的目的是能鏈接執(zhí)行一個(gè)js文件
@node "C:\User\user\bin\node-echo.js" %*這樣就完成了在任何目錄下使用
node-echo命令
工程目錄
- /hoem/user/workspace/node-echo/ # 工程目錄- bin # 存放命令行相關(guān)代碼node-echo.js+ doc/ # 存放相關(guān)文檔- lib/ # 存放api相關(guān)代碼cho.js- node_modules/ # 存放第三方包+ argv/+ tests/ # 存放測(cè)試用例package.json # 元數(shù)據(jù)文件README.md # 說明文件文件內(nèi)容
/*bin/node-echo*/ var argv = require("argv"),echo = require('../lib/echo'); console.log(echo(argv.join("")));/*lib/echo.js*/ module.exports = function (message) {return message; };/*package.json*/ {"name": "node-echo","main": "./lib/echo.js", }npm
使用npm
require("argv");因?yàn)榈谌邪趎ode_modules文件夾下,所以直接加上名稱即可使用
包依賴聲明
{"name": "node-echo","main": "./lib/echo.js","dependencies": {"argv": "0.0.2",}, };聲明該報(bào)依賴argv包的0.0.2版本
下載包時(shí)候
直接
即可批量安裝聲明的依賴包
當(dāng)他人下載的時(shí)候,也會(huì)自動(dòng)下載進(jìn)一步的依賴的第三方包
目錄結(jié)構(gòu)如下
這樣就完成了包的問題
安裝命令行程序
~ %APPDATA%\npm\ # 在windows系統(tǒng)下- node_modules\+ node-echo\node-echo.cmd版本號(hào)
x,y,z
修復(fù)bug時(shí),需要更新z位 增加新功能,并且向下兼容,更新到y(tǒng)為 大變動(dòng),不兼容,更新到x位一些比較有用的npm
npm cache clear # 清空npm本地緩存 npm update -g # 將全局安裝的包更新到最新版小結(jié)
寫代碼前,目錄結(jié)構(gòu)規(guī)劃后
稍微大的程序,使用模塊化管理
文件操作
首先
提供了一些文件操作的api
小文件拷貝
var fs = require("fs");var data = fs.readFileSync('input.txt');data = "sdferg" + data.toString(); for(var i = 0; i <= 10; i++){data = data + data; }fs.writeFileSync('put.txt', data);console.log(data); console.log("程序執(zhí)行結(jié)束!");將其保存進(jìn)內(nèi)存中,進(jìn)行操作
隨帶著解釋一下第一句,第一句中的是將其fs模塊讀取,并保存進(jìn)入fs對(duì)象中
大文件拷貝
如果文件過大,這樣保存進(jìn)入內(nèi)存拷貝會(huì)導(dǎo)致內(nèi)存溢出,所以一點(diǎn)一點(diǎn)讀,邊讀邊寫
var fs = require("fs");var txt = fs.createReadStream("input.txt"); // 創(chuàng)建了一個(gè)只讀數(shù)據(jù)流 var writeTxt = fs.createWriteStream("out.txt"); //創(chuàng)建了一個(gè)寫的數(shù)據(jù)流 txt.pipe(writeTxt);創(chuàng)建兩個(gè)流,將其連接,完成文件的讀寫
一些大致的api
數(shù)據(jù)塊
buffer對(duì)二進(jìn)制數(shù)據(jù)的操作
類似于C中的指針
slice方法類似C中的對(duì)于指針的移動(dòng)
數(shù)據(jù)流
stream基于事件工作,這是需要注意的
使用數(shù)據(jù)流的問題在于會(huì)產(chǎn)生讀完以后無法處理的情況,通過回調(diào)函數(shù),達(dá)到通知以后在讓生產(chǎn)者進(jìn)行處理,即消費(fèi)者每消費(fèi)一件,生產(chǎn)者進(jìn)行生產(chǎn)
ps: 回調(diào)目前看不懂,異步在下一節(jié)中有
這一點(diǎn)過
遍歷目錄
當(dāng)要找到并處理制定目錄下的所有js文件的時(shí)候,需要遍歷整個(gè)目錄
遞歸算法
遍歷目錄采用的是遞歸算法
遍歷算法
目錄為樹狀結(jié)構(gòu),遍歷采用深度優(yōu)先+先序的算法進(jìn)行遍歷嗎,到達(dá)節(jié)點(diǎn)以后,首先接著遍歷子節(jié)點(diǎn),而不是鄰居節(jié)點(diǎn),
舉例
上方的樹,先A > B > D > E > C > F
ps。。我需要數(shù)據(jù)結(jié)構(gòu)。。有必要折騰一本js的數(shù)據(jù)結(jié)構(gòu)和算法同步遍歷
先遇到目錄,然后接著遇到文件,當(dāng)遇到文件的時(shí)候,暫停遍歷,將結(jié)果通過回調(diào)函數(shù)給主程序進(jìn)行判斷,接著判斷結(jié)果返回,根據(jù)判斷的結(jié)果繼續(xù)進(jìn)行遍歷
異步遍歷
和同步變量完全相同,不過,是邊遍歷邊進(jìn)行返回,同時(shí)主程序也在運(yùn)行
文本編碼
常用的一個(gè)是萬(wàn)國(guó)碼的存儲(chǔ)方式utf-8,一個(gè)是gbk
bom的問題
bom會(huì)標(biāo)記文件的一些相關(guān)信息,下面是一個(gè)使用函數(shù),將其bom移出
function readText(pathname) {var bin = fs.readFileSync(pathname); // 創(chuàng)建一個(gè)流 創(chuàng)建一個(gè)讀取文件的數(shù)據(jù)流if (bin[0] === 0xEF && bin[1] === 0xBB %% bin[2] === 0xBF) {bin = bin.slice(3); // 去除bom}return bin.toString('utf-8') // 以u(píng)tf-8的格式進(jìn)行返回 };GBK轉(zhuǎn)utf-8
GBk某種原因,不在支持范圍內(nèi)部,所以,如果讀取,需要將其轉(zhuǎn)換為utf-8
使用這個(gè)包iconv-lite進(jìn)行轉(zhuǎn)換,先使用npm進(jìn)行下載,完后進(jìn)行讀取,下面編寫一個(gè)函數(shù)進(jìn)行讀取
單字節(jié)編碼
因?yàn)橛⑽淖帜笡]有問題,全是ASCII進(jìn)行編碼和存儲(chǔ)的,由于gbk和utf-8的問題的導(dǎo)致,所以呢,儲(chǔ)存漢字的二進(jìn)制依舊不變即可,只變英文字母
小結(jié)
path模塊進(jìn)行路徑的拼接
fs模塊的同步更好用,異步真的能讓人崩潰
目錄遍歷和文件編碼的處理
總結(jié)
以上是生活随笔為你收集整理的代码组织和部署 文件操作 node.js的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跟我一起学docker(四)--容器的基
- 下一篇: linux常用基础命令操作收集