代碼組織和部署 模塊的路徑解析規則
require支持/或者盤符的絕對路徑,也支持./開頭的相對地址
同時require也支持第三種寫法
如果傳遞給require的函數是node.js的內置模塊,將會不做路徑解析,直接返回內部exports模塊要導出的對象
node_modules目錄node.js定義一個node_modules存放模塊,每次使用foo/bar的方式的時候,會先尋找該目錄下的node_modules,接著上一層,知道頂層為止
NODE_PATH環境變量如果設置變量,將會按照變量的地址進行尋找
包包是由多個子模塊組成的大模塊為包,其中所有的子模塊都放進同一個目錄里
index.js當模塊文件名為index.js的時候,加載模塊所在目錄的路徑代替模塊文件路徑
package.jsonpackage.json能自定義入口模塊的路徑、
-/home/user/lib `cat/ + doc/ - lib/ head.js body.js main.js + tests/ package.json
以上為一個目錄文件
配置文件內容如下
{ "name": "cat"; "main": "./lib/main.js"; }
其中定義該包的名稱為cat,入口文件為相對路徑下的main.js
即,加載該模塊的時候路徑為
/home/user/lib/cat
node.js會自動根據配置文件找到入口模塊所在的位置
命令行程序為了在任何目錄實現
node-echo hello wordwindows
需要cmd文件,
需要先將其目錄添加到環境變量 在該目錄下創建cmd文件創建cmd文件的目的是能鏈接執行一個js文件
@node "C:Useruserin ode-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版本
下載包時候
直接
npm-install
即可批量安裝聲明的依賴包
當他人下載的時候,也會自動下載進一步的依賴的第三方包
目錄結構如下
- project/ - node_modules/ - node-echo/ - node-modules/ + argv/
這樣就完成了包的問題
安裝命令行程序~ %APPDATA% pm # 在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 C / D E F
上方的樹,先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進行下載,完后進行讀取,下面編寫一個函數進行讀取
var iconv = require("iconv-lite"); // 加載相關模塊 function readGBKText(pathname) { var bin = fs.readFileSync(pathname); // 創建文件流 return iconv.decode(bin, "gbk"); // 使用iconv模塊的decode方法,對bin進行轉換 }單字節編碼
因為英文字母沒有問題,全是ASCII進行編碼和存儲的,由于gbk和utf-8的問題的導致,所以呢,儲存漢字的二進制依舊不變即可,只變英文字母
小結path模塊進行路徑的拼接
fs模塊的同步更好用,異步真的能讓人崩潰
目錄遍歷和文件編碼的處理
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108094.html
摘要:根據調研機構公司最新的全球公共云服務支出調查預測,云計算支出增長速度比整體支出快七倍。領先的云計算供應商提供廣泛的不同計算和存儲實例,使客戶能夠選擇最符合他們需求的性能特征。在云計算的早期階段,企業面臨的最大問題是他們是否應該使用公共云服務。如今,幾乎所有的組織都在采用一些公共云服務。更重要的問題是企業應該使用哪種云服務:基礎設施即服務(IaaS),平臺即服務(PaaS),還是軟件即服務(S...
摘要:在調研插件后,發現無法滿足以及等要求時,果斷選用了做服務器渲染。布局目錄該目錄名為保留的,不可更改。服務器啟動的時候,該目錄下的文件會映射至應用的根路徑下。它可以在服務端或路由更新之前被調用。可用于指定服務端返回的請求狀態碼。 開頭還是來一段廢話: 年關將近,給大家拜個早年,愿大家年會都能抽大獎,來年行大運。 廢話不多說,直接進正文 項目環境: 前端vue項目, 需要將新增的幾個路由頁...
摘要:輕量級,部署簡單。此外,本文也不是入門文檔,而是為了預防陷坑而給出的指導意見,故在閱讀本文之前還請先仔細閱讀的文檔。可視作的一個最小部署和運行單元,簡單的說,可類比為。,主,負責部署程序中其他的。嚴格來講,之后,上述第一點并不完全正確。 一直以來早有將這些年用Vert.x的經驗整理一下的想法,奈何天生不是勤快人,直到最近扶墻老師問起,遂成此文。 選擇理由 現在想想,我們應該算是國內用V...
摘要:作為系列的新篇章,我選擇從超級賬本的開始。為什么選擇超級賬本作為起點我在之前的文章中曾說過會從超級賬本入手開始區塊鏈的學習和實踐,同時也給出了個人的理由。檢查事務提議的響應。為了降低區塊鏈應用的開發難度,超級賬本項目又引入了。 本著以教帶學,Learning by Doing的想法,我于上周加入了Bob組織的HiBlock區塊鏈技術布道群。這個群可不太好混,群規要求每個成員必需每周有輸...
閱讀 3639·2021-11-24 09:38
閱讀 3142·2021-11-15 11:37
閱讀 781·2021-11-12 10:36
閱讀 3547·2021-10-21 09:38
閱讀 3220·2021-09-28 09:36
閱讀 2420·2021-09-22 16:01
閱讀 4984·2021-09-22 15:09
閱讀 1210·2019-08-30 15:55