亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

Cc_2011 / 3417人閱讀

代碼組織和部署 模塊的路徑解析規(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.js
            body.js
            main.js
        + tests/
        package.json

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

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

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

/home/user/lib/cat

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

命令行程序

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

node-echo hello word
windows

需要cmd文件,

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

創(chuàng)建cmd文件的目的是能鏈接執(zhí)行一個(gè)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/    # 存放測(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í)候
直接

npm-install

即可批量安裝聲明的依賴包
當(dāng)他人下載的時(shí)候,也會(huì)自動(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
版本號(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   C
       /    
      D   E   F

上方的樹,先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)行讀取

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

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

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

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

小結(jié)

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/108094.html

相關(guān)文章

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

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

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

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

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

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

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

    Turbo 評(píng)論0 收藏0
  • Hyperledger Fabric周周記:起源

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

    hatlonely 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<