nodejs交互工具庫 -- fs-extra, Acorn和zlib

nodejs交互工具庫系列

做用
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 自動尋找 800065535內可用端口號
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交互工具庫 -- ora和envinfonpm

nodejs交互工具庫 -- memfs和execajson

nodejs交互工具庫 -- webpack-merge和webpack-chainsegmentfault

nodejs交互工具庫 -- strip-ansi, address, default-gateway和joiapi

nodejs交互工具庫 -- fs-extra, Acorn和zlib

fs-extra

fs-extra添加了未包含在原生fs模塊中的文件系統方法,並向fs方法添加了promise支持。它還使用graceful-fs來防止EMFILE錯誤。它應該是替換 fs的一個降級(drop in replacement)。

Why?

我已經厭倦了在個人大多數項目中包括 mkdirprimrafncp

Installation

npm install fs-extra

Usage

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')

Sync vs Async vs Async/Await

大多數方法默認狀況下是異步的。若是沒有傳入回調,全部異步方法都將返回一個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()

Methods

Async

Sync

NOTE: 您仍然可使用原生的Node.js方法。它們被promise化並複製給fs-extra. 查看notes on fs.read(), fs.write(), & fs.writev()

What happened to walk() and walkSync()?

在v2.0.0中從 fs-extra中刪除了它們。若是您須要該功能,能夠將walkwalkSync做爲單獨的包提供,即klawklaw-sync

參考

基本經常使用的方法場景就這些了,更完整的用法能夠直接查閱文檔

node-fs-extra

Acorn

一個小而快速的JavaScript解析器,徹底用JavaScript編寫。

Community

Acorn是MIT license許可的下開源軟件發佈

歡迎在githubreport bugs或建立pull request。對於問題和討論,請使用Tern discussion forum

Packages

這個存儲庫包含三個包:

要構建存儲庫的內容,請運行 npm install.

git clone https://github.com/acornjs/acorn.git
cd acorn
npm install

Plugin developments

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)
    }
  }
}

參考

基本經常使用的方法場景就這些了,更完整的用法能夠直接查閱文檔

acorn

zlib.js

ZLIB.js是ZLIB(RFC1950), DEFLATE(RFC1951), GZIP(RFC1952)和PKZIP在JavaScript實現。

Usage

在「bin」目錄中使用一個。

  • zlib_and_gzip.min.js: ZLIB + GZIP

    • (Raw)

      • rawdeflate.js: Raw Deflate
      • rawinflate.js: Raw Inflate
    • zlib.min.js: ZLIB Inflate + Deflate

      • inflate.min.js: ZLIB Inflate
      • deflate.min.js: ZLIB Deflate
      • inflate_stream.min.js: ZLIB Inflate (stream mode)
    • (GZIP)

      • gzip.min.js: GZIP
      • gunzip.min.js: GUNZIP
    • (PKZIP)

      • zip.min.js ZIP
      • unzip.min.js UNZIP
  • node-zlib.js: (ZLIB + GZIP for node.js)

Compression

Raw Deflate

// plain = Array.<number> or Uint8Array
var deflate = new Zlib.RawDeflate(plain);
var compressed = deflate.compress();

Raw Deflate Option

看ZLIB選項。

ZLIB

// plain = Array.<number> or Uint8Array
var deflate = new Zlib.Deflate(plain);
var compressed = deflate.compress();
ZLIB Option

Zlib.Deflate第二參數結構

{
    compressionType: Zlib.Deflate.CompressionType, // compression type
    lazy: number // 懶惰匹配參數
}

Zlib.Deflate.CompressionType是可枚舉的, 在NONE(存儲)、FIXED(固定霍夫曼編碼)、DYNAMIC(動態霍夫曼編碼)中選擇一個。默認值是DYNAMIC

lazy 是懶惰的匹配長度。不建議使用此參數。

GZIP

GZIP實現是不完整的。可是,在平常使用中沒有問題。

// plain = Array.<number> or Uint8Array
var gzip = new Zlib.Gzip(plain);
var compressed = gzip.compress();
GZIP Option
{
    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
}

PKZIP

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;
}
PKZIP Option

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
}

Decompression

Raw Deflate

// compressed = Array.<number> or Uint8Array
var inflate = new Zlib.RawInflate(compressed);
var plain = inflate.decompress();

Raw Deflate Option

See ZLIB Option.

ZLIB

// compressed = Array.<number> or Uint8Array
var inflate = new Zlib.Inflate(compressed);
var plain = inflate.decompress();
ZLIB Option

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.

GZIP

// compressed = Array.<number> or Uint8Array
var gunzip = new Zlib.Gunzip(compressed);
var plain = gunzip.decompress();

PKZIP

// compressed = Array.<number> or Uint8Array
var unzip = new Zlib.Unzip(compressed);
var filenames = unzip.getFilenames();
var plain = unzip.decompress(filenames[0]);

Node.js

看到單元測試. https://github.com/imaya/zlib...

Debug

若是您想在編譯以前瞭解代碼,可使用SourceMaps和PrettyPrint。

Source Map

若是您想要使用源映射,請使用dev版本。

例如,您想使用源映射的膨脹。

- inflate.min.js // release version
- inflate.dev.min.js // development version <- use this

Pretty Print

zlib.pretty.js未重命名符號。

How to build

使用Grunt和閉包編譯器構建.

Requirement

  • Grunt
  • Python

Build

使用"grunt" 命令.

$ grunt [target]

Build 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

Test

單元測試使用Karma和mocha。

$ npm test

Browser only

$ npm run test-karma

Node.js only

$ npm run test-mocha

參考

基本經常使用的方法場景就這些了,更完整的用法能夠直接查閱文檔

zlib.js

相關文章
相關標籤/搜索