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