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 | 测量两字符串之间的差异 最快的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交互工具库 -- leven, lru cache和portfinder
nodejs交互工具库 -- webpack-merge和webpack-chain
nodejs交互工具库 -- strip-ansi, address, default-gateway和joi
nodejs交互工具库 -- fs-extra, Acorn和zlib
ora
优雅的终端转轮
Install
yarn add ora
Usage
const ora = require('ora');
const spinner = ora('Loading unicorns').start();
setTimeout(() => {
spinner.color = 'yellow';
spinner.text = 'Loading rainbows';
}, 1000);
API
ora(text)
ora(options)
如果提供了字符串,则将其视为 options.text
的快捷方式
options
Type: object
text
Type: string
在转轮后显示的文本。
prefixText
Type: string | () => string
文本或返回要在转轮前显示的文本的函数。如果设置为空字符串,将不显示前缀文本。
spinner
Type: string | object
Default: 'dots'
provided spinners其中一个的名字. 如果您想测试不同的纺纱工,请参阅repo中的 example.js
。在Windows上,它总是使用line
转轮,因为Windows命令行没有适当的Unicode支持。
或者像这样的对象:
{
interval: 80, // Optional
frames: ['-', '+', '-']
}
color
Type: string
Default: 'cyan'
Values: 'black' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan' | 'white' | 'gray'
转轮颜色
hideCursor
Type: boolean
Default: true
设置为false将阻止Ora隐藏光标
indent
Type: number
Default: 0
用给定的空格数缩进微调格
interval
Type: number
Default: 由转轮提供或 100
每帧之间的间隔。
转轮提供了它们自己的推荐间隔,所以实际上不需要指定这个间隔。
stream
Type: stream.Writable
Default: process.stderr
流来写入输出。
例如,您可以将其设置为process.stdout
。
isEnabled
Type: boolean
强制启用/禁用转轮。如果未指定,则如果流在TTY上下文中(未派生或管道传输)和/或不在CI环境中运行,则转轮将被启用。
注意 {isEnabled: false}
并不意味着它不会输出任何东西。它只是意味着它不会输出转轮、颜色和其他ansi转义代码。它仍然会记录文本。
isSilent
Type: boolean
Default: false
禁用转轮和所有日志文本。将考虑压制和启用所有输出false
.
discardStdin
Type: boolean
Default: true
丢弃stdin输入(Ctrl+C除外) 当它是TTY运行。这可以防止转轮在输入时抖动,在按 Enter 键时输出折线,并防止在转轮运行时对输入进行缓冲。
这对Windows没有影响,因为没有好的方法来正确地实现丢弃stdin。
Instance
.start(text?)
启动转轮。返回的实例。如果提供了文本,则设置当前文本。
.stop()
停止并清除转轮。返回的实例。
.succeed(text?)
停止转轮,将其更改为绿色 ✔
并持久化当前文本,或 text
如果提供。返回的实例。请看下面的GIF图
.fail(text?)
停止旋转,将其改为红色 ✖
并持久化当前文本,或 text
如果提供。返回的实例。请看下面的GIF。
.warn(text?)
停止转轮,将其更改为黄色 ⚠
并持久化当前文本,或text
如果提供。返回的实例。
.info(text?)
停止转轮,将其更改为蓝色 ℹ
并持久化当前文本,或text
如果提供。返回的实例。
.isSpinning
一个布尔值,表示实例当前是否在旋转。
.stopAndPersist(options?)
停止转轮并更改符号或文本。返回的实例。请看下面的GIF。
options
Type: object
symbol
Type: string
Default: ' '
将转轮替换为
text
Type: string
Default: Current 'text'
将持久存储在符号之后的文本
prefixText
Type: string
Default: Current prefixText
将保存在符号之前的文本。如果设置为空字符串,将不显示前缀文本。
.clear()
清理转轮。返回的实例。
.render()
手工渲染一个新帧。返回的实例。
.frame()
给一个新帧
.text
更改转轮后的文本。
.prefixText
更改转轮之前的文本。如果设置为空字符串,将不显示前缀文本。
.color
更改转轮颜色。
.spinner
改变转轮。
.indent
更改转轮缩进。
ora.promise(action, text)
ora.promise(action, options)
开始一个转轮的promise。如果promise实现,则使用.succeed()
停止转轮;如果拒绝,则使用.fail()
停止转轮。返回转轮实例。
action
Type: Promise
FAQ
如何改变文本的颜色?
Use Chalk:
const ora = require('ora');
const chalk = require('chalk');
const spinner = ora(`Loading ${chalk.red('unicorns')}`).start();
为什么转轮会冻结?
JavaScript是单线程的,因此同步操作会阻塞线程,包括旋转器动画。尽可能选择异步操作。
参考
基本常用的方法场景就这些了,更完整的用法可以直接查阅文档
envinfo
envinfo生成故障排除软件问题(如操作系统、二进制版本、浏览器、已安装语言等)时所需的通用详细信息的报告
问题
- 它在我的电脑上工作
- “命令未找到”
- 您正在运行什么版本的“命令”?
- 您正在运行什么版本的“不同命令”?
- 你有“插入晦涩的android sdk版本”吗?
- 每个github问题报告模板:
请提供浏览器版本,Node.js版本,操作系统,编程语言等相关信息。
方案
- 快速、轻松地将所有这些信息收集到一个地方。
Installation
要使用CLI工具,请全局安装此包:
npm install -g envinfo || yarn global add envinfo
或者,使用不安装的npx:
npx envinfo
在另一个项目中作为库使用:
npm install envinfo || yarn add envinfo
CLI Usage
envinfo` || `npx envinfo
System:
OS: macOS Mojave 10.14.5
CPU: (8) x64 Intel(R) Core(TM) i7-7820HQ CPU @ 2.90GHz
Memory: 2.97 GB / 16.00 GB
Shell: 5.3 - /bin/zsh
Binaries:
Node: 8.16.0 - ~/.nvm/versions/node/v8.16.0/bin/node
Yarn: 1.15.2 - ~/.yarn/bin/yarn
npm: 6.9.0 - ~/.nvm/versions/node/v8.16.0/bin/npm
Watchman: 4.9.0 - /usr/local/bin/watchman
Managers:
Cargo: 1.31.0 - ~/.cargo/bin/cargo
CocoaPods: 1.7.3 - /usr/local/bin/pod
Composer: 1.8.6 - /usr/local/bin/composer
Gradle: 5.5 - /usr/local/bin/gradle
Homebrew: 2.1.7 - /usr/local/bin/brew
Maven: 3.6.1 - /usr/local/bin/mvn
pip2: 19.0.3 - /usr/local/bin/pip2
pip3: 19.0.2 - /usr/local/bin/pip3
RubyGems: 2.5.2.3 - /usr/bin/gem
Utilities:
CMake: 3.13.3 - /usr/local/bin/cmake
Make: 3.81 - /usr/bin/make
GCC: 10.14. - /usr/bin/gcc
Git: 2.20.0 - /usr/local/bin/git
Mercurial: 4.5.3 - /usr/bin/hg
Clang: 1001.0.46.4 - /usr/bin/clang
Subversion: 1.10.3 - /usr/bin/svn
Servers:
Apache: 2.4.34 - /usr/sbin/apachectl
Nginx: 1.13.12 - /usr/local/bin/nginx
Virtualization:
Docker: 18.09.1 - /usr/local/bin/docker
Parallels: 13.3.0 - /usr/local/bin/prlctl
VirtualBox: 5.2.20 - /usr/local/bin/vboxmanage
SDKs:
iOS SDK:
Platforms: iOS 12.2, macOS 10.14, tvOS 12.2, watchOS 5.2
Android SDK:
API Levels: 28
Build Tools: 28.0.3
System Images: android-28 | Google Play Intel x86 Atom
IDEs:
Android Studio: 3.2 AI-181.5540.7.32.5056338
Atom: 1.23.3
Emacs: 22.1.1 - /usr/bin/emacs
Nano: 2.0.6 - /usr/bin/nano
VSCode: 1.36.0 - /usr/local/bin/code
Vim: 8.0 - /usr/bin/vim
Xcode: 10.2.1/10E1001 - /usr/bin/xcodebuild
Languages:
Bash: 4.4.23 - /usr/local/bin/bash
Elixir: 1.6.2 - /usr/local/bin/elixir
Go: 1.11.1 - /usr/local/bin/go
Java: 1.8.0_192 - /usr/bin/javac
Perl: 5.18.4 - /usr/bin/perl
PHP: 7.1.23 - /usr/bin/php
Python: 2.7.16 - /usr/local/bin/python
Python3: 3.7.2 - /usr/local/bin/python3
R: 3.6.0 - /usr/local/bin/R
Ruby: 2.3.7 - /usr/bin/ruby
Rust: 1.16.0 - /Users/tabrindle/.cargo/bin/rustup
Databases:
MongoDB: 3.6.4 - /usr/local/bin/mongo
MySQL: 10.3.10 (MariaDB) - /usr/local/bin/mysql
PostgreSQL: 10.3 - /usr/local/bin/postgres
SQLite: 3.24.0 - /usr/bin/sqlite3
Browsers:
Chrome: 75.0.3770.100
Chrome Canary: 77.0.3847.0
Firefox: 68.0
Firefox Developer Edition: 69.0
Firefox Nightly: 69.0a1
Safari: 12.1.1
Safari Technology Preview: 13.0
npmPackages:
apollo-client: ^2.3.1 => 2.3.1
jest: ^22.2.1 => 22.2.1
...
react: ^16.3.2 => 16.3.2
react-apollo: ^2.1.4 => 2.1.4
run4staged: ^1.1.1 => 1.1.1
solidarity: 2.0.5 => 2.0.5
styled-components: ^3.1.6 => 3.1.6
npmGlobalPackages:
create-react-app: 1.5.2
create-react-native-app: 1.0.0
envinfo: 5.10.0
exp: 49.2.2
gatsby-cli: 1.1.52
npm: 5.6.0
react-native-cli: 2.0.1
solidarity: 2.1.0
typescript: 2.8.1
Programmatic Usage
Envinfo接受一个配置对象并返回一个Promise ,该Promise 解析一个字符串(可选yaml、json或markdown)
import envinfo from 'envinfo';
envinfo.run(
{
System: ['OS', 'CPU'],
Binaries: ['Node', 'Yarn', 'npm'],
Browsers: ['Chrome', 'Firefox', 'Safari'],
npmPackages: ['styled-components', 'babel-plugin-styled-components'],
},
{ json: true, showNotFound: true }
).then(env => console.log(env));
日志
{
"System": {
"OS": "macOS High Sierra 10.13",
"CPU": "x64 Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz"
},
"Binaries": {
"Node": {
"version": "8.11.0",
"path": "~/.nvm/versions/node/v8.11.0/bin/node"
},
"Yarn": {
"version": "1.5.1",
"path": "~/.yarn/bin/yarn"
},
"npm": {
"version": "5.6.0",
"path": "~/.nvm/versions/node/v8.11.0/bin/npm"
}
},
"Browsers": {
"Chrome": {
"version": "67.0.3396.62"
},
"Firefox": {
"version": "59.0.2"
},
"Safari": {
"version": "11.0"
}
},
"npmPackages": {
"styled-components": {
"wanted": "^3.2.1",
"installed": "3.2.1"
},
"babel-plugin-styled-components": "Not Found"
}
}
所有的envinfo助手也被导出以供使用。你可以整体使用envinfo,也可以只使用你需要的部分,比如:
const envinfo = require('envinfo');
// each helper returns a promise
const node = await envinfo.helpers.getNodeInfo();
// The promises resolve to an array of values: ["Name", "Version", "Path"]
// e.g. ["Node", "10.9.0", "/usr/local/bin/node"]
console.log(`Node: ${node[1]} - ${node[2]}`); // "Node: 10.9.0 - ~/.nvm/versions/node/v8.14.0/bin/node"
CLI Options
--system Print general system info such as OS, CPU, Memory and Shell
--browsers Get version numbers of installed web browsers
--SDKs Get platforms, build tools and SDKs of iOS and Android
--IDEs Get version numbers of installed IDEs
--languages Get version numbers of installed languages such as Java, Python, PHP, etc
--binaries Get version numbers of node, npm, watchman, etc
--npmPackages Get version numbers of locally installed npm packages - glob, string, or comma delimited list
--npmGlobalPackages Get version numbers of globally installed npm packages
--duplicates Mark duplicate npm packages inside parentheses eg. (2.1.4)
--fullTree Traverse entire node_modules dependency tree, not just top level
--markdown Print output in markdown format
--json Print output in JSON format
--console Print to console (defaults to on for CLI usage, off for programmatic usage)
Integration
envinfo已经集成到:
- React Native (
react-native info
) - Create React App (
create-react-app --info
) - Expo CLI (
expo diagnostics
) - Webpack (
webpack-cli info
) - Solidarity (
solidarity report
) - Gatsby (
gatsby info
)
envinfo 使用在 ISSUE_TEMPLATE:
Alternatives
- type
command -v
直到你打碎了你的电脑 - specs - 一个优秀的ruby gem运行
command -v
为:all-the-things:伟大的原始信息。 - screenfetch - 获取系统和终端信息,并显示漂亮的ascii标识
- Solidarity - 基于项目的环境检查器
- 编写您自己的
参考
基本常用的方法场景就这些了,更完整的用法可以直接查阅文档