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 | 主动寻找 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和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?
我曾经厌倦了在我的大多数我的项目中包含 mkdirp
、rimraf
和ncp
。
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
中删除了它们。如果您须要该性能,能够将walk
和walkSync
作为独自的包提供,即klaw
和klaw-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.gitcd acornnpm 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 Uint8Arrayvar deflate = new Zlib.RawDeflate(plain);var compressed = deflate.compress();
Raw Deflate Option
看ZLIB选项。
ZLIB
// plain = Array.<number> or Uint8Arrayvar 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 Uint8Arrayvar 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();// plainData1zip.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 Uint8Arrayvar inflate = new Zlib.RawInflate(compressed);var plain = inflate.decompress();
Raw Deflate Option
See ZLIB Option.
ZLIB
// compressed = Array.<number> or Uint8Arrayvar 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 Uint8Arrayvar gunzip = new Zlib.Gunzip(compressed);var plain = gunzip.decompress();
PKZIP
// compressed = Array.<number> or Uint8Arrayvar 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