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

码农天地 -
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或jsonresolve实现node的 require.resolve()算法,这样就可以异步和同步地使用require.resolve()代表文件semvernpm的语义版本器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调用获得机器的默认网关joiJavaScript最强大的模式描述语言和数据验证器。fs-extra添加了未包含在原生fs模块中的文件系统方法,并向fs方法添加了promise支持Acorn一个小而快速的JavaScript解析器,完全用JavaScript编写。zlib.jsZLIB.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()
MethodsAsynccopyemptyDirensureFileensureDirensureLinkensureSymlinkmkdirpmkdirsmoveoutputFileoutputJsonpathExistsreadJsonremovewriteJsonSynccopySyncemptyDirSyncensureFileSyncensureDirSyncensureLinkSyncensureSymlinkSyncmkdirpSyncmkdirsSyncmoveSyncoutputFileSyncoutputJsonSyncpathExistsSyncreadJsonSyncremoveSyncwriteJsonSync

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 Deflaterawinflate.js: Raw Inflate

zlib.min.js: ZLIB Inflate + Deflate

inflate.min.js: ZLIB Inflatedeflate.min.js: ZLIB Deflateinflate_stream.min.js: ZLIB Inflate (stream mode)

(GZIP)

gzip.min.js: GZIPgunzip.min.js: GUNZIP

(PKZIP)

zip.min.js ZIPunzip.min.js UNZIPnode-zlib.js: (ZLIB + GZIP for node.js)CompressionRaw 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
}
DecompressionRaw 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和闭包编译器构建.

RequirementGruntPythonBuild

使用"grunt" 命令.

$ grunt [target]
Build targettargetgenerate fileimplementationdepsdeps.js(dependency: deps.js)deflatedeflate.min.jsZLIB Deflateinflateinflate.min.jsZLIB Inflateinflate_streaminflate_stream.min.jsZLIB Inflate (stream)zlibzlib.min.jsZLIB Deflate + Inflategzipgzip.min.jsGZIP Compressiongunzipgunzip.min.jsGZIP Decompressionzlib_and_gzipzlib_and_gzip.min.jsZLIB + GZIPnodenode-zlib.jsZLIB + GZIP for node.jszipzip.min.jsPKZIP Compressionunzipunzip.min.jsPKZIP Decompressionall*default targetTest

单元测试使用Karma和mocha。

$ npm test
Browser only
$ npm run test-karma
Node.js only
$ npm run test-mocha
参考

基本常用的方法场景就这些了,更完整的用法可以直接查阅文档

zlib.js

特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

Tags 标签

加个好友,技术交流

1628738909466805.jpg