庫 | 做用 |
---|---|
chalk-pipe | 使用更簡單的樣式字符串建立粉筆樣式方案 |
chalk | 正確處理終端字符串樣式 |
Commander.js | 完整的 node.js 命令行解決方案 |
Inquirer.js | 一組通用的交互式命令行用戶界面。 |
slash | 系統路徑符處理 |
minimist | 解析參數選項 |
dotenv | 將環境變量從 .env文件加載到process.env中 |
dotenv-expand | 擴展計算機上已經存在的環境變量 |
hash-sum | 很是快的惟一哈希生成器 |
deepmerge | 深度合併兩個或多個對象的可枚舉屬性。 |
yaml-front-matter | 解析yaml或json |
resolve | 實現node的 require.resolve() 算法,這樣就能夠異步和同步地使用require.resolve()表明文件 |
semver | npm的語義版本器 |
leven | 測量兩字符串之間的差別<br/>最快的JS實現之一 |
lru cache | 刪除最近最少使用的項的緩存對象 |
portfinder | 自動尋找 8000 至65535 內可用端口號 |
ora | 優雅的終端轉輪 |
envinfo | 生成故障排除軟件問題(如操做系統、二進制版本、瀏覽器、已安裝語言等)時所需的通用詳細信息的報告 |
memfs | 內存文件系統與Node's fs API相同實現 |
execa | 針對人類的流程執行 |
webpack-merge | 用於鏈接數組和合並對象,從而建立一個新對象 |
webpack-chain | 使用鏈式API去生成簡化webpack版本配置的修改 |
strip-ansi | 從字符串中去掉ANSI轉義碼 |
address | 獲取當前機器的IP, MAC和DNS服務器。 |
default-gateway | 經過對OS路由接口的exec調用得到機器的默認網關 |
joi | JavaScript最強大的模式描述語言和數據驗證器。 |
fs-extra | 添加了未包含在原生fs 模塊中的文件系統方法,並向fs 方法添加了promise支持 |
Acorn | 一個小而快速的JavaScript解析器,徹底用JavaScript編寫。 |
zlib.js | ZLIB.js是ZLIB(RFC1950), DEFLATE(RFC1951), GZIP(RFC1952)和PKZIP在JavaScript實現。 |
nodejs交互工具庫 -- chalk-pipe和chalknode
nodejs交互工具庫 -- commander和Inquirerwebpack
nodejs交互工具庫 -- slash, minimist和dotenv, dotenv-expandgit
nodejs交互工具庫 -- hash-sum, deepmerge和yaml-front-mattergithub
nodejs交互工具庫 -- resolve和semverweb
nodejs交互工具庫 -- leven, lru cache和portfinder算法
nodejs交互工具庫 -- memfs和execajson
nodejs交互工具庫 -- webpack-merge和webpack-chainsegmentfault
nodejs交互工具庫 -- strip-ansi, address, default-gateway和joiapi
nodejs交互工具庫 -- fs-extra, Acorn和zlib
fs-extra
添加了未包含在原生fs
模塊中的文件系統方法,並向fs
方法添加了promise支持。它還使用graceful-fs
來防止EMFILE
錯誤。它應該是替換 fs
的一個降級(drop in replacement)。
我已經厭倦了在個人大多數項目中包括 mkdirp
、rimraf
和ncp
。
npm install fs-extra
fs-extra
是原生 fs
的降級. fs
中的全部方法都附加到fs-extra
中。若是沒有傳入回調,全部的fs
方法都會返回promises 。
你不再須要包含原來的 fs
模塊了:
const fs = require('fs') // 這已經沒有必要了
你如今能夠這樣作了:
const fs = require('fs-extra')
或者,若是你更喜歡明確你使用的是 fs-extra
而不是fs
,你可能想要命名你的fs
變量fse
這樣:
const fse = require('fs-extra')
你也能夠二者都保留,但這是多餘的:
const fs = require('fs') const fse = require('fs-extra')
大多數方法默認狀況下是異步的。若是沒有傳入回調,全部異步方法都將返回一個promise。
另外一方面,若是發生錯誤,同步方法將拋出。
此外,若是發生Async/Await將拋出一個錯誤。
例子:
const fs = require('fs-extra') // 異步promises: fs.copy('/tmp/myfile', '/tmp/mynewfile') .then(() => console.log('success!')) .catch(err => console.error(err)) // 異步callbacks: fs.copy('/tmp/myfile', '/tmp/mynewfile', err => { if (err) return console.error(err) console.log('success!') }) // Sync: try { fs.copySync('/tmp/myfile', '/tmp/mynewfile') console.log('success!') } catch (err) { console.error(err) } // Async/Await: async function copyFiles () { try { await fs.copy('/tmp/myfile', '/tmp/mynewfile') console.log('success!') } catch (err) { console.error(err) } } copyFiles()
NOTE: 您仍然可使用原生的Node.js方法。它們被promise化並複製給fs-extra
. 查看notes on fs.read()
, fs.write()
, & fs.writev()
walk()
and walkSync()
?在v2.0.0中從 fs-extra
中刪除了它們。若是您須要該功能,能夠將walk
和walkSync
做爲單獨的包提供,即klaw
和klaw-sync
。
基本經常使用的方法場景就這些了,更完整的用法能夠直接查閱文檔
一個小而快速的JavaScript解析器,徹底用JavaScript編寫。
Acorn是MIT license許可的下開源軟件發佈
歡迎在github上 report bugs或建立pull request。對於問題和討論,請使用Tern discussion forum。
這個存儲庫包含三個包:
要構建存儲庫的內容,請運行 npm install
.
git clone https://github.com/acornjs/acorn.git cd acorn npm install
Acorn旨在支持插件,這些插件能夠在合理的範圍內從新定義解析器的工做方式。插件能夠添加新的令牌類型和新的令牌器上下文(若是須要的話),並擴展解析器對象中的方法。這並非一個乾淨、優雅的api—使用它須要瞭解Acorn的內部原理,而插件在那些內部原理髮生重大變化時極可能會崩潰。可是,經過這種方式,能夠爲JavaScript方言建立解析器,而不須要建立Acorn的全部分支。原則上甚至能夠合併這些插件,若是你有,例如,解析類型的插件和解析JSX樣式的XML文本的插件,您能夠同時加載它們並使用JSX標記和類型解析代碼。
插件是從解析器類到擴展解析器類的函數。插件能夠經過簡單地將它們應用到解析器類(或者已經被其餘插件擴展的解析器類的一個版本)來使用。但在語法上,當你使用多個插件時,靜態方法解析器,會變得有些笨拙。extend可使用任意數量的插件值做爲參數來調用,從而建立由全部這些插件擴展的解析器類。您一般只須要建立一次這樣的擴展類,而後反覆調用它的parse,以免沒必要要地混淆JavaScript引擎的優化器。
const {Parser} = require("acorn") const MyParser = Parser.extend( require("acorn-jsx")(), require("acorn-bigint") ) console.log(MyParser.parse("// Some bigint + JSX code"))
插件在其新的解析器類中覆蓋方法以實現額外的功能。推薦插件包導出插件函數做爲默認值,或者,若是它接受配置參數,導出一個建立插件函數的構造函數。
下面是一個簡單的插件,它向 readToken
方法添加了一些代碼,看起來可能像這樣:
module.exports = function noisyReadToken(Parser) { return class extends Parser { readToken(code) { console.log("Reading a token!") super.readToken(code) } } }
基本經常使用的方法場景就這些了,更完整的用法能夠直接查閱文檔
ZLIB.js是ZLIB(RFC1950), DEFLATE(RFC1951), GZIP(RFC1952)和PKZIP在JavaScript實現。
在「bin」目錄中使用一個。
zlib_and_gzip.min.js: ZLIB + GZIP
(Raw)
zlib.min.js: ZLIB Inflate + Deflate
(GZIP)
(PKZIP)
// plain = Array.<number> or Uint8Array var deflate = new Zlib.RawDeflate(plain); var compressed = deflate.compress();
看ZLIB選項。
// plain = Array.<number> or Uint8Array var deflate = new Zlib.Deflate(plain); var compressed = deflate.compress();
Zlib.Deflate第二參數結構
{ compressionType: Zlib.Deflate.CompressionType, // compression type lazy: number // 懶惰匹配參數 }
Zlib.Deflate.CompressionType
是可枚舉的, 在NONE
(存儲)、FIXED
(固定霍夫曼編碼)、DYNAMIC
(動態霍夫曼編碼)中選擇一個。默認值是DYNAMIC
。
lazy
是懶惰的匹配長度。不建議使用此參數。
GZIP實現是不完整的。可是,在平常使用中沒有問題。
// plain = Array.<number> or Uint8Array var gzip = new Zlib.Gzip(plain); var compressed = gzip.compress();
{ deflateOptions: Object, // see: deflate option (ZLIB Option) flags: { fname: boolean, // use filename? comment: boolean, // use comment? fhcrc: boolean // use file checksum? }, filename: string, // filename comment: string // comment }
var zip = new Zlib.Zip(); // plainData1 zip.addFile(plainData1, { filename: stringToByteArray('foo.txt') }); zip.addFile(plainData2, { filename: stringToByteArray('bar.txt') }); zip.addFile(plainData3, { filename: stringToByteArray('baz.txt') }); var compressed = zip.compress(); function stringToByteArray(str) { var array = new (window.Uint8Array !== void 0 ? Uint8Array : Array)(str.length); var i; var il; for (i = 0, il = str.length; i < il; ++i) { array[i] = str.charCodeAt(i) & 0xff; } return array; }
filename, comment, extraField必須使用Uint8Array若是啓用類型化數組。
{ filename: (Array.<number>|Uint8Array), // filename comment: (Array.<number>|Uint8Array), //comment extraField: (Array.<number>|Uint8Array), // extra field compress: boolean, // compress when called "addFile" method. compressionMethod: Zlib.Zip.CompressionMethod, // STORE or DEFLATE os: Zlib.Zip.OperatingSystem, // MSDOS or UNIX or MACINTOSH deflateOption: Object // see: ZLIB Option }
// compressed = Array.<number> or Uint8Array var inflate = new Zlib.RawInflate(compressed); var plain = inflate.decompress();
See ZLIB Option.
// compressed = Array.<number> or Uint8Array var inflate = new Zlib.Inflate(compressed); var plain = inflate.decompress();
Zlib.Inflate第二參數結構
{ 'index': number, // start position in input buffer 'bufferSize': number, // initial output buffer size 'bufferType': Zlib.Inflate.BufferType, // buffer expantion type 'resize': boolean, // resize buffer(ArrayBuffer) when end of decompression (default: false) 'verify': boolean // verify decompression result (default: false) }
Zlib.Inflate.BufferType
可列舉的。 ADAPTIVE
(默認) 和BLOCK
選擇一個.
ADAPTIVE
: 緩衝擴展基於填充緩衝的壓縮比BLOCK
: 緩衝器擴展基於BufferSize
.// compressed = Array.<number> or Uint8Array var gunzip = new Zlib.Gunzip(compressed); var plain = gunzip.decompress();
// compressed = Array.<number> or Uint8Array var unzip = new Zlib.Unzip(compressed); var filenames = unzip.getFilenames(); var plain = unzip.decompress(filenames[0]);
看到單元測試. https://github.com/imaya/zlib...
若是您想在編譯以前瞭解代碼,可使用SourceMaps和PrettyPrint。
若是您想要使用源映射,請使用dev版本。
例如,您想使用源映射的膨脹。
- inflate.min.js // release version - inflate.dev.min.js // development version <- use this
zlib.pretty.js
未重命名符號。
使用Grunt和閉包編譯器構建.
使用"grunt" 命令.
$ grunt [target]
target | generate file | implementation |
---|---|---|
deps | deps.js | (dependency: deps.js) |
deflate | deflate.min.js | ZLIB Deflate |
inflate | inflate.min.js | ZLIB Inflate |
inflate_stream | inflate_stream.min.js | ZLIB Inflate (stream) |
zlib | zlib.min.js | ZLIB Deflate + Inflate |
gzip | gzip.min.js | GZIP Compression |
gunzip | gunzip.min.js | GZIP Decompression |
zlib_and_gzip | zlib_and_gzip.min.js | ZLIB + GZIP |
node | node-zlib.js | ZLIB + GZIP for node.js |
zip | zip.min.js | PKZIP Compression |
unzip | unzip.min.js | PKZIP Decompression |
all | * | default target |
單元測試使用Karma和mocha。
$ npm test
$ npm run test-karma
$ npm run test-mocha
基本經常使用的方法場景就這些了,更完整的用法能夠直接查閱文檔