乐趣区

关于javascript:nodejs交互工具库-fsextra-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 和 chalk

nodejs 交互工具库 — commander 和 Inquirer

nodejs 交互工具库 — slash, minimist 和 dotenv, dotenv-expand

nodejs 交互工具库 — hash-sum, deepmerge 和 yaml-front-matter

nodejs 交互工具库 — resolve 和 semver

nodejs 交互工具库 — leven, lru cache 和 portfinder

nodejs 交互工具库 — ora 和 envinfo

nodejs 交互工具库 — memfs 和 execa

nodejs 交互工具库 — webpack-merge 和 webpack-chain

nodejs 交互工具库 — strip-ansi, address, default-gateway 和 joi

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

  • copy
  • emptyDir
  • ensureFile
  • ensureDir
  • ensureLink
  • ensureSymlink
  • mkdirp
  • mkdirs
  • move
  • outputFile
  • outputJson
  • pathExists
  • readJson
  • remove
  • writeJson

Sync

  • copySync
  • emptyDirSync
  • ensureFileSync
  • ensureDirSync
  • ensureLinkSync
  • ensureSymlinkSync
  • mkdirpSync
  • mkdirsSync
  • moveSync
  • outputFileSync
  • outputJsonSync
  • pathExistsSync
  • readJsonSync
  • removeSync
  • writeJsonSync

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 许可的下开源软件公布

欢送在 github 上 report bugs 或创立 pull request。对于问题和探讨,请应用 Tern discussion forum。

Packages

这个存储库蕴含三个包:

  • acorn: 次要的解析器
  • acorn-loose: 容错解析器
  • acorn-walk: 语法树分析器

要构建存储库的内容,请运行 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

退出移动版