成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

代碼組織和部署 文件操作 node.js

Cc_2011 / 3353人閱讀

代碼組織和部署 模塊的路徑解析規(guī)則

require支持/或者盤符的絕對路徑,也支持./開頭的相對地址
同時require也支持第三種寫法

內(nèi)置模塊

如果傳遞給require的函數(shù)是node.js的內(nèi)置模塊,將會不做路徑解析,直接返回內(nèi)部exports模塊要導(dǎo)出的對象

node_modules目錄

node.js定義一個node_modules存放模塊,每次使用foo/bar的方式的時候,會先尋找該目錄下的node_modules,接著上一層,知道頂層為止

NODE_PATH環(huán)境變量

如果設(shè)置變量,將會按照變量的地址進(jìn)行尋找

包是由多個子模塊組成的大模塊為包,其中所有的子模塊都放進(jìn)同一個目錄里

index.js

當(dāng)模塊文件名為index.js的時候,加載模塊所在目錄的路徑代替模塊文件路徑

package.json

package.json能自定義入口模塊的路徑、

-/home/user/lib
    `cat/
        + doc/
        - lib/
            head.js
            body.js
            main.js
        + tests/
        package.json

以上為一個目錄文件
配置文件內(nèi)容如下

{
    "name": "cat";
    "main": "./lib/main.js";
}

其中定義該包的名稱為cat,入口文件為相對路徑下的main.js
即,加載該模塊的時候路徑為

/home/user/lib/cat

node.js會自動根據(jù)配置文件找到入口模塊所在的位置

命令行程序

為了在任何目錄實(shí)現(xiàn)

node-echo hello word
windows

需要cmd文件,

需要先將其目錄添加到環(huán)境變量 在該目錄下創(chuàng)建cmd文件

創(chuàng)建cmd文件的目的是能鏈接執(zhí)行一個js文件

@node "C:Useruserin
ode-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/    # 存放測試用例
    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",
    },
};

聲明該報依賴argv包的0.0.2版本
下載包時候
直接

npm-install

即可批量安裝聲明的依賴包
當(dāng)他人下載的時候,也會自動下載進(jìn)一步的依賴的第三方包
目錄結(jié)構(gòu)如下

- project/
    - node_modules/
        - node-echo/
            - node-modules/
                + argv/

這樣就完成了包的問題

安裝命令行程序
~ %APPDATA%
pm    # 在windows系統(tǒng)下
    - node_modules
        + node-echo
    node-echo.cmd
版本號

x,y,z

修復(fù)bug時,需要更新z位
增加新功能,并且向下兼容,更新到y(tǒ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對象中

大文件拷貝

如果文件過大,這樣保存進(jìn)入內(nèi)存拷貝會導(dǎo)致內(nèi)存溢出,所以一點(diǎn)一點(diǎn)讀,邊讀邊寫

var fs = require("fs");

var txt = fs.createReadStream("input.txt");    // 創(chuàng)建了一個只讀數(shù)據(jù)流
var writeTxt = fs.createWriteStream("out.txt");    //創(chuàng)建了一個寫的數(shù)據(jù)流
txt.pipe(writeTxt);

創(chuàng)建兩個流,將其連接,完成文件的讀寫

一些大致的api 數(shù)據(jù)塊

buffer對二進(jìn)制數(shù)據(jù)的操作
類似于C中的指針
slice方法類似C中的對于指針的移動

數(shù)據(jù)流

stream基于事件工作,這是需要注意的
使用數(shù)據(jù)流的問題在于會產(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文件的時候,需要遍歷整個目錄

遞歸算法

遍歷目錄采用的是遞歸算法

遍歷算法

目錄為樹狀結(jié)構(gòu),遍歷采用深度優(yōu)先+先序的算法進(jìn)行遍歷嗎,到達(dá)節(jié)點(diǎn)以后,首先接著遍歷子節(jié)點(diǎn),而不是鄰居節(jié)點(diǎn),
舉例

          A
         / 
        B   C
       /    
      D   E   F

上方的樹,先A > B > D > E > C > F

ps。。我需要數(shù)據(jù)結(jié)構(gòu)。。有必要折騰一本js的數(shù)據(jù)結(jié)構(gòu)和算法
同步遍歷

先遇到目錄,然后接著遇到文件,當(dāng)遇到文件的時候,暫停遍歷,將結(jié)果通過回調(diào)函數(shù)給主程序進(jìn)行判斷,接著判斷結(jié)果返回,根據(jù)判斷的結(jié)果繼續(xù)進(jìn)行遍歷

異步遍歷

和同步變量完全相同,不過,是邊遍歷邊進(jìn)行返回,同時主程序也在運(yùn)行

文本編碼

常用的一個是萬國碼的存儲方式utf-8,一個是gbk

bom的問題

bom會標(biāo)記文件的一些相關(guān)信息,下面是一個使用函數(shù),將其bom移出

function readText(pathname) {
    var bin = fs.readFileSync(pathname);    // 創(chuàng)建一個流 創(chuàng)建一個讀取文件的數(shù)據(jù)流

    if (bin[0] === 0xEF && bin[1] === 0xBB %% bin[2] === 0xBF) {
        bin = bin.slice(3);     // 去除bom
    }

    return bin.toString("utf-8")    // 以utf-8的格式進(jìn)行返回
};
GBK轉(zhuǎn)utf-8

GBk某種原因,不在支持范圍內(nèi)部,所以,如果讀取,需要將其轉(zhuǎn)換為utf-8
使用這個包iconv-lite進(jìn)行轉(zhuǎn)換,先使用npm進(jìn)行下載,完后進(jìn)行讀取,下面編寫一個函數(shù)進(jìn)行讀取

var iconv = require("iconv-lite");    // 加載相關(guān)模塊

function readGBKText(pathname) {
    var bin = fs.readFileSync(pathname);    // 創(chuàng)建文件流

    return iconv.decode(bin, "gbk");    // 使用iconv模塊的decode方法,對bin進(jìn)行轉(zhuǎn)換
}
單字節(jié)編碼

因?yàn)橛⑽淖帜笡]有問題,全是ASCII進(jìn)行編碼和存儲的,由于gbk和utf-8的問題的導(dǎo)致,所以呢,儲存漢字的二進(jìn)制依舊不變即可,只變英文字母

小結(jié)

path模塊進(jìn)行路徑的拼接
fs模塊的同步更好用,異步真的能讓人崩潰
目錄遍歷和文件編碼的處理

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108094.html

相關(guān)文章

  • IaaS vs PaaS vs SaaS:應(yīng)該選擇哪一個?

    摘要:根據(jù)調(diào)研機(jī)構(gòu)公司最新的全球公共云服務(wù)支出調(diào)查預(yù)測,云計算支出增長速度比整體支出快七倍。領(lǐng)先的云計算供應(yīng)商提供廣泛的不同計算和存儲實(shí)例,使客戶能夠選擇最符合他們需求的性能特征。在云計算的早期階段,企業(yè)面臨的最大問題是他們是否應(yīng)該使用公共云服務(wù)。如今,幾乎所有的組織都在采用一些公共云服務(wù)。更重要的問題是企業(yè)應(yīng)該使用哪種云服務(wù):基礎(chǔ)設(shè)施即服務(wù)(IaaS),平臺即服務(wù)(PaaS),還是軟件即服務(wù)(S...

    Riddler 評論0 收藏0
  • 前言 已經(jīng)有阮一峰老師的持續(xù)集成服務(wù) Travis CI 教程,為什么還要寫這篇文章? 原因有二: 文章內(nèi)容有些過時 文章覆蓋度不夠,有些實(shí)踐細(xì)節(jié)沒寫出來 由于以上原因,縱然可以筆者很快在Github集成Travis?CI并成功構(gòu)建,但在發(fā)布時卻踩了一些坑,折騰一波才終于發(fā)布成功。故寫下此文,旨在補(bǔ)充更多的細(xì)節(jié),幫助他人少走彎路。 正文 免費(fèi)購買Travis?CI應(yīng)用 點(diǎn)擊?https:/...

    novo 評論0 收藏0
  • vue 服務(wù)器端渲染 nuxt.js初探

    摘要:在調(diào)研插件后,發(fā)現(xiàn)無法滿足以及等要求時,果斷選用了做服務(wù)器渲染。布局目錄該目錄名為保留的,不可更改。服務(wù)器啟動的時候,該目錄下的文件會映射至應(yīng)用的根路徑下。它可以在服務(wù)端或路由更新之前被調(diào)用。可用于指定服務(wù)端返回的請求狀態(tài)碼。 開頭還是來一段廢話: 年關(guān)將近,給大家拜個早年,愿大家年會都能抽大獎,來年行大運(yùn)。 廢話不多說,直接進(jìn)正文 項(xiàng)目環(huán)境: 前端vue項(xiàng)目, 需要將新增的幾個路由頁...

    bingchen 評論0 收藏0
  • Vert.x入坑須知(1)

    摘要:輕量級,部署簡單。此外,本文也不是入門文檔,而是為了預(yù)防陷坑而給出的指導(dǎo)意見,故在閱讀本文之前還請先仔細(xì)閱讀的文檔??梢曌鞯囊粋€最小部署和運(yùn)行單元,簡單的說,可類比為。,主,負(fù)責(zé)部署程序中其他的。嚴(yán)格來講,之后,上述第一點(diǎn)并不完全正確。 一直以來早有將這些年用Vert.x的經(jīng)驗(yàn)整理一下的想法,奈何天生不是勤快人,直到最近扶墻老師問起,遂成此文。 選擇理由 現(xiàn)在想想,我們應(yīng)該算是國內(nèi)用V...

    Turbo 評論0 收藏0
  • Hyperledger Fabric周周記:起源

    摘要:作為系列的新篇章,我選擇從超級賬本的開始。為什么選擇超級賬本作為起點(diǎn)我在之前的文章中曾說過會從超級賬本入手開始區(qū)塊鏈的學(xué)習(xí)和實(shí)踐,同時也給出了個人的理由。檢查事務(wù)提議的響應(yīng)。為了降低區(qū)塊鏈應(yīng)用的開發(fā)難度,超級賬本項(xiàng)目又引入了。 本著以教帶學(xué),Learning by Doing的想法,我于上周加入了Bob組織的HiBlock區(qū)塊鏈技術(shù)布道群。這個群可不太好混,群規(guī)要求每個成員必需每周有輸...

    hatlonely 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<