库 | 做用 |
---|---|
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和chalkhtml
nodejs交互工具库 -- commander和Inquirernode
nodejs交互工具库 -- slash, minimist和dotenv, dotenv-expandwebpack
nodejs交互工具库 -- hash-sum, deepmerge和yaml-front-mattergit
nodejs交互工具库 -- resolve和semvergithub
nodejs交互工具库 -- leven, lru cache和portfinderweb
nodejs交互工具库 -- webpack-merge和webpack-chain编程
nodejs交互工具库 -- strip-ansi, address, default-gateway和joijson
nodejs交互工具库 -- fs-extra, Acorn和zlib
实现node的 require.resolve()
算法,这样就能够异步和同步地使用require.resolve()表明文件
异步解析:
var resolve = require('resolve'); resolve('tap', { basedir: __dirname }, function (err, res) { if (err) console.error(err); else console.log(res); });
$ node example/async.js /home/substack/projects/node-resolve/node_modules/tap/lib/main.js
同步解析:
var resolve = require('resolve'); var res = resolve.sync('tap', { basedir: __dirname }); console.log(res);
$ node example/sync.js /home/substack/projects/node-resolve/node_modules/tap/lib/main.js
var resolve = require('resolve');
对于同步和异步方法,错误可能具备如下任何一种err.code
值
MODULE_NOT_FOUND
: 给定的路径字符串 (id
) 没法解析到模块INVALID_BASEDIR
: 指定的 opts.basedir
不存在,或者不是目录INVALID_PACKAGE_MAIN
: package.json
遇到了一个无效的 main
属性(如。不是一个字符串)异步解析模块路径字符串 id
进 cb(err, res [, pkg])
, pkg
(若是定义)是来自的数据 package.json
.
选项有:
package.json
能应用被加载模块的数据opts.packageFilter(pkg, pkgfile, dir)
- 在查看“main”字段以前先转换已解析的package.json内容
opts.pathFilter(pkg, path, relativePath)
- 转换包中的路径
opts.paths - require.paths数组使用,若是没有找到正常 node_modules
递归遍历(可能不用这个)
对于高级用户, paths
也能够是 opts.paths(request, start, opts)
函数
node_modules
解决方案opts.packageIterator(request, start, opts)
- 返回能够找到包源的候选路径列表(可能不使用这个)
node_modules
解决方案"node_modules"
默认 opts
值:
{ paths: [], basedir: __dirname, extensions: ['.js'], readFile: fs.readFile, isFile: function isFile(file, cb) { fs.stat(file, function (err, stat) { if (!err) { return cb(null, stat.isFile() || stat.isFIFO()); } if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); return cb(err); }); }, isDirectory: function isDirectory(dir, cb) { fs.stat(dir, function (err, stat) { if (!err) { return cb(null, stat.isDirectory()); } if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); return cb(err); }); }, realpath: function realpath(file, cb) { var realpath = typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath; realpath(file, function (realPathErr, realPath) { if (realPathErr && realPathErr.code !== 'ENOENT') cb(realPathErr); else cb(null, realPathErr ? file : realPath); }); }, moduleDirectory: 'node_modules', preserveSymlinks: false }
同步解析模块路径字符串id,返回结果并在id没法解析时抛出错误。
选项有:
opts.packageFilter(pkg, pkgfile, dir)
- 转换解析后package.json内容,而后查看“main”字段
opts.pathFilter(pkg, path, relativePath)
- 转换包中的路径
opts.paths - require.paths数组使用,若是没有找到正常 node_modules
递归遍历(可能不用这个)
对于高级用户, paths
也能够是 opts.paths(request, start, opts)
函数
node_modules
解决方案opts.packageIterator(request, start, opts)
- 返回能够找到包源的候选路径列表(可能不使用这个)
node_modules
解决方案"node_modules"
default opts
values:
{ paths: [], basedir: __dirname, extensions: ['.js'], readFileSync: fs.readFileSync, isFile: function isFile(file) { try { var stat = fs.statSync(file); } catch (e) { if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; throw e; } return stat.isFile() || stat.isFIFO(); }, isDirectory: function isDirectory(dir) { try { var stat = fs.statSync(dir); } catch (e) { if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; throw e; } return stat.isDirectory(); }, realpathSync: function realpathSync(file) { try { var realpath = typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync; return realpath(file); } catch (realPathErr) { if (realPathErr.code !== 'ENOENT') { throw realPathErr; } } return file; }, moduleDirectory: 'node_modules', preserveSymlinks: false }
yarn add resolve
基本经常使用的方法场景就这些了,更完整的用法能够直接查阅文档
npm的语义版本器
yarn add semver
做为node模块
const semver = require('semver') semver.valid('1.2.3') // '1.2.3' semver.valid('a.b.c') // null semver.clean(' =v1.2.3 ') // '1.2.3' semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true semver.gt('1.2.3', '9.8.7') // false semver.lt('1.2.3', '9.8.7') // true semver.minVersion('>=1.0.0') // '1.0.0' semver.valid(semver.coerce('v2')) // '2.0.0' semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
若是但愿最小化内存占用,还能够为所关心的函数加载模块。
// load the whole API at once in a single object const semver = require('semver') // or just load the bits you need // all of them listed here, just pick and choose what you want // classes const SemVer = require('semver/classes/semver') const Comparator = require('semver/classes/comparator') const Range = require('semver/classes/range') // functions for working with versions const semverParse = require('semver/functions/parse') const semverValid = require('semver/functions/valid') const semverClean = require('semver/functions/clean') const semverInc = require('semver/functions/inc') const semverDiff = require('semver/functions/diff') const semverMajor = require('semver/functions/major') const semverMinor = require('semver/functions/minor') const semverPatch = require('semver/functions/patch') const semverPrerelease = require('semver/functions/prerelease') const semverCompare = require('semver/functions/compare') const semverRcompare = require('semver/functions/rcompare') const semverCompareLoose = require('semver/functions/compare-loose') const semverCompareBuild = require('semver/functions/compare-build') const semverSort = require('semver/functions/sort') const semverRsort = require('semver/functions/rsort') // low-level comparators between versions const semverGt = require('semver/functions/gt') const semverLt = require('semver/functions/lt') const semverEq = require('semver/functions/eq') const semverNeq = require('semver/functions/neq') const semverGte = require('semver/functions/gte') const semverLte = require('semver/functions/lte') const semverCmp = require('semver/functions/cmp') const semverCoerce = require('semver/functions/coerce') // working with ranges const semverSatisfies = require('semver/functions/satisfies') const semverMaxSatisfying = require('semver/ranges/max-satisfying') const semverMinSatisfying = require('semver/ranges/min-satisfying') const semverToComparators = require('semver/ranges/to-comparators') const semverMinVersion = require('semver/ranges/min-version') const semverValidRange = require('semver/ranges/valid') const semverOutside = require('semver/ranges/outside') const semverGtr = require('semver/ranges/gtr') const semverLtr = require('semver/ranges/ltr') const semverIntersects = require('semver/ranges/intersects') const simplifyRange = require('semver/ranges/simplify') const rangeSubset = require('semver/ranges/subset')
做为命令行工具:
$ semver -h A JavaScript implementation of the https://semver.org/ specification Copyright Isaac Z. Schlueter Usage: semver [options] <version> [<version> [...]] Prints valid versions sorted by SemVer precedence Options: -r --range <range> Print versions that match the specified range. -i --increment [<level>] Increment a version by the specified level. Level can be one of: major, minor, patch, premajor, preminor, prepatch, or prerelease. Default level is 'patch'. Only one version may be specified. --preid <identifier> Identifier to be used to prefix premajor, preminor, prepatch or prerelease version increments. -l --loose Interpret versions and ranges loosely -p --include-prerelease Always include prerelease versions in range matching -c --coerce Coerce a string into SemVer if possible (does not imply --loose) --rtl Coerce version strings right to left --ltr Coerce version strings left to right (default) 若是任何有效版本知足全部提供的范围,程序将成功退出,并打印全部知足的版本。 若是没有找到满意的版本,则退出失败。 版本是按升序打印的,所以向实用程序提供多个版本只是对它们进行排序。
“version”由在https://semver.org/找到的v2.0...。
开头的 “=”
或“v”
字符被删除并忽略。
version range
是一套 comparators
指定知足范围的版本。
comparator
由operator
和 version
组成。原始运算符集合为:
<
小于<=
小于或等于>
大于>=
大于或等于=
平等的。若是没有指定操做符,则假定相等,所以该操做符是可选的,但能够包含其中。例如, comparator >=1.2.7
将匹配版本1.2.7
, 1.2.8
, 2.5.3
, 和1.3.9
, 但不是版本 1.2.6
或1.1.0
.
Comparators能够用空格链接成 comparator set
,这是由它所包含的全部比较器的交点所知足的。
一个范围由一个或多个比较器集合组成,并由||链接起来。 当且仅当至少一个||分离的比较器集合中的每一个比较器的版本知足时,版本匹配一个范围。
例如,范围 >=1.2.7 <1.3.0
将匹配版本 1.2.7
, 1.2.8
, 和1.2.99
, 但不是版本 1.2.6
, 1.3.0
, 或1.1.0
.
范围 1.2.7 || >=1.2.9 <2.0.0
将匹配版本 1.2.7
, 1.2.9
, 和 1.4.6
, 但不是版本 1.2.8
或2.0.0
.
若是一个版本有prerelease标签(例如, 1.2.3-alpha.3
),那么只有当至少一个具备相同元组的[major, minor, patch]
的comparator也有prerelease标签时,才容许它知足comparator集。
例如,范围 >1.2.3-alpha.3
将被容许与版本1.2.3-alpha.7
匹配,但它不会知足3.4.5-alpha.9
,尽管是3.4.5 alpha.9
在技术上“大于”1.2.3-alpha.3
根据SemVer排序规则。版本范围只接受 1.2.3
版本的预发行标签。版本3.4.5
将知足这个范围,由于它没有prerelease标志,并且 3.4.5
大于1.2.3-alpha.7
。
这种行为的目的是双重的。首先,预发行版本常常更新得很是快,而且包含了许多(根据做者的设计)还不适合公众使用的破坏性更改。所以,默认状况下,它们被排除在范围匹配语义以外。
第二,选择使用预发行版本的用户已经明确表示了使用特定的alpha/beta/rc版本集的意图。经过在范围内包含prerelease标签,用户代表他们意识到了风险。然而,假设他们在下一组预发行版本中选择承担相似的风险仍然是不恰当的。
注意,能够经过将options对象上的 includePrerelease
标记设置为执行范围匹配的任何函数来抑制此行为(将全部prerelease版本视为正常版本,以便进行范围匹配)。
.inc
方法有一个附加的identifier
字符串参数,它将附加字符串的值做为预发布标识符:
semver.inc('1.2.3', 'prerelease', 'beta') // '1.2.4-beta.0'
命令行示例:
$ semver 1.2.3 -i prerelease --preid beta 1.2.4-beta.0
可用于进一步增长:
$ semver 1.2.4-beta.0 -i prerelease 1.2.4-beta.1
高级范围语法以肯定的方式转换为基本比较器。
高级范围能够像原始比较器同样使用空格或 ||
组合。
X.Y.Z - A.B.C
指定包含集。
1.2.3 - 2.3.4
:= >=1.2.3 <=2.3.4
若是提供的部分版本是包含范围内的第一个版本,那么丢失的部分将被替换为零。
1.2 - 2.3.4
:= `>=1.2.0 <=2.3.4若是提供的部分版本做为包含范围中的第二个版本,则接受以提供的元组部件开始的全部版本,但不接受大于提供的元组部件的版本。
1.2.3 - 2.3
:= >=1.2.3 <2.4.0-0
1.2.3 - 2
:= >=1.2.3 <3.0.0-0
1.2.x
1.X
1.2.*
*
任何 X、x
或*
均可用于“代入”其中一个数值 [major, minor, patch]
元组.
*
:= >=0.0.0
(Any version satisfies)1.x
:= >=1.0.0 <2.0.0-0
(Matching major version)1.2.x
:= >=1.2.0 <1.3.0-0
(Matching major and minor versions)部分版本范围被视为x范围,所以特殊字符其实是可选的。
""
(empty string) := *
:= >=0.0.0
1
:= 1.x.x
:= >=1.0.0 <2.0.0-0
1.2
:= 1.2.x
:= >=1.2.0 <1.3.0-0
~1.2.3
~1.2
~1
若是在比较器上指定了次要版本,则容许补丁级更改。若是不容许,容许小级别更改。
~1.2.3
:= >=1.2.3 <1.(2+1).0
:= >=1.2.3 <1.3.0-0
~1.2
:= >=1.2.0 <1.(2+1).0
:= >=1.2.0 <1.3.0-0
(Same as 1.2.x
)~1
:= >=1.0.0 <(1+1).0.0
:= >=1.0.0 <2.0.0-0
(Same as 1.x
)~0.2.3
:= >=0.2.3 <0.(2+1).0
:= >=0.2.3 <0.3.0-0
~0.2
:= >=0.2.0 <0.(2+1).0
:= >=0.2.0 <0.3.0-0
(Same as 0.2.x
)~0
:= >=0.0.0 <(0+1).0.0
:= >=0.0.0 <1.0.0-0
(Same as 0.x
)~1.2.3-beta.2
:= >=1.2.3-beta.2 <1.3.0-0
注意,1.2.3
版本中的prerelease将被容许,若是它们大于或等于beta.2
。因此,1.2.3-beta.4
是容许的,但1.2.4-beta.2
不会,由于它是一个不一样 [major, minor, patch]
元组的预发行。^1.2.3
^0.2.5
^0.0.4
容许不修改 [major, minor, patch]
元组属性中最左边的非零元素更改. 换句话说,这容许 1.0.0
及以上版本的补丁和小更新, 0.X >=0.1.0
版本的补丁更新, 0.0.X
版本没有更新.
许多做者对待0.x
就好像 x
是主要的“中断-更改”指示器。
看成者可能进行中断更改时,在 0.2.4
和0.3.0
发布管理之间插入符号范围是理想的, 这是一种常见的作法. However, 它假定 0.2.4
和 0.2.5
二者之间不会有中断变化. 根据一般观察到的实践,它容许假定是附加的(但不会破坏)更改。
^1.2.3
:= >=1.2.3 <2.0.0-0
^0.2.3
:= >=0.2.3 <0.3.0-0
^0.0.3
:= >=0.0.3 <0.0.4-0
^1.2.3-beta.2
:= >=1.2.3-beta.2 <2.0.0-0
Note that prereleases in the 1.2.3
version will be allowed, if they are greater than or equal to beta.2
. So, 1.2.3-beta.4
would be allowed, but 1.2.4-beta.2
would not, because it is a prerelease of a different [major, minor, patch]
tuple.^0.0.3-beta
:= >=0.0.3-beta <0.0.4-0
Note that prereleases in the 0.0.3
version only will be allowed, if they are greater than or equal to beta
. So, 0.0.3-pr.2
would be allowed.在解析插入符号范围时,缺失的patch
值将退化为0,但容许在该值内保持灵活性,即便主版本和次版本都为0。
^1.2.x
:= >=1.2.0 <2.0.0-0
^0.0.x
:= >=0.0.0 <0.1.0-0
^0.0
:= >=0.0.0 <0.1.0-0
缺失的 minor
和patch
值将退化为零,但也容许在这些值中保持灵活性,即便主版本为零。
^1.x
:= >=1.0.0 <2.0.0-0
^0.x
:= >=0.0.0 <1.0.0-0
把全部这些放在一块儿,下面是一个用于范围的Backus-Naur语法,以方便解析器做者:
range-set ::= range ( logical-or range ) * logical-or ::= ( ' ' ) * '||' ( ' ' ) * range ::= hyphen | simple ( ' ' simple ) * | '' hyphen ::= partial ' - ' partial simple ::= primitive | partial | tilde | caret primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? xr ::= 'x' | 'X' | '*' | nr nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * tilde ::= '~' partial caret ::= '^' partial qualifier ::= ( '-' pre )? ( '+' build )? pre ::= parts build ::= parts parts ::= part ( '.' part ) * part ::= nr | [-0-9A-Za-z]+
全部方法和类都采用最终的options
对象参数。此对象中的全部选项默认为 false
。支持的选项有:
loose
对不彻底有效的semver字符串更加宽容。(固然,任何结果输出都是100%严格兼容的。)因为向后兼容性的缘由,若是options参数是一个布尔值而不是一个对象,它将被解释为松散参数。includePrerelease
设置为禁止从范围中排除预先标记的版本的默认行为,除非它们被显式地选择。严格模式比较器和范围对于解析的SemVer字符串是严格的。
valid(v)
: 返回解析后的版本,若是无效则返回nullinc(v, release)
: 返回按发布类型递增的版本 (major
, premajor
, minor
, preminor
, patch
, prepatch
, 或者prerelease
), 或null,若是它无效
premajor
在一个调用中会将版本提高到下一个主版本并下降到主版本的预发行版. preminor
, 和prepatch
以一样的方式工做。prerelease
和 prepatch
同样的运做. 它增长补丁版本,而后制做预发行版。若是输入的版本已是预发行版本,它就会增长它。prerelease(v)
: 返回预发行组件的数组,若是不存在,则返回null. 例如: prerelease('1.2.3-alpha.1') -> ['alpha', 1]
major(v)
: 返回主版本号。minor(v)
: 返回副版本号。patch(v)
: 返回补丁版本号。intersects(r1, r2, loose)
: 若是两个提供的范围或比较器相交,则返回true。parse(v)
: 尝试将字符串解析为语义版本,返回 SemVer
对象或者 null
.gt(v1, v2)
: v1 > v2
gte(v1, v2)
: v1 >= v2
lt(v1, v2)
: v1 < v2
lte(v1, v2)
: v1 <= v2
eq(v1, v2)
: v1 == v2
若是它们在逻辑上是等价的,即便它们不是彻底相同的字符串。您已经知道如何比较字符串。neq(v1, v2)
: v1 != v2
eq
的反面.cmp(v1, comparator, v2)
: 传入一个比较字符串,它将调用上面对应的函数. "==="
和 "!=="
作简单的字符串比较,可是为了完整起见,这里包含了。若是提供了无效的比较字符串,则引起。compare(v1, v2)
: 若是v1 == v2返回0,若是v1大于1,若是v2大于-1。若是传递给Array.sort(),则按升序排序。rcompare(v1, v2)
: 是compare的反义词。传递到的版本数组按降序排序 Array.sort()
.compareBuild(v1, v2)
: 与比较相同,但在两个版本相同时考虑构建。若是传递给Array.sort(),则按升序排序。v2更大。若是传递给 Array.sort()
,则按升序排序。diff(v1, v2)
: 按发布类型返回两个版本之间的差别 (major
, premajor
, minor
, preminor
, patch
, prepatch
, 或者prerelease
), 或若是版本相同,则为null。intersects(comparator)
: 若是比较器相交,返回truevalidRange(range)
: 返回有效范围,若是无效则返回nullsatisfies(version, range)
: 若是版本知足范围,则返回true。maxSatisfying(versions, range)
: 返回列表中知足范围的最高版本,若是没有一个版本知足范围,则返回nullminSatisfying(versions, range)
: 返回列表中知足范围的最低版本,若是没有一个版本知足范围,则返回null。minVersion(range)
: 返回可能与给定范围匹配的最低版本。gtr(version, range)
: 若是版本大于范围内全部可能的版本,则返回true。ltr(version, range)
: 若是版本小于范围内全部可能的版本,则返回true。outside(version, range, hilo)
: 若是版本在高方向或低方向超出范围的范围,则返回true。hilo参数必须是字符串 '>'
或'<'
。(这是gtr
和ltr
调用的函数。)intersects(range)
: 若是任何一个范围比较器相交,返回truesimplifyRange(versions, range)
: 返回一个“简化”范围,该范围匹配版本列表中指定的相同项。注意,它并不保证在全部状况下都匹配相同的版本,只对提供的一组版本进行匹配。这在经过编程方式将多个版本与||结合在一块儿生成范围时很是有用,能够为用户提供一些更符合人体工程学的东西。若是提供的范围的字符串长度小于生成的范围,则返回该范围。subset(subRange, superRange)
: 若是子程序范围彻底包含在超范围范围内,则返回true。注意,因为范围多是非连续的,版本可能不大于范围、小于范围或知足范围!例如,范围 1.2 <1.2.9 || >2.0.0
从1.2.9
到2.0.0
会有一个洞,因此 1.2.10
版本不会大于范围(由于2.0.1
知足,较高),也不到范围(由于1.2.8
知足,这是低),并且它也不知足。
若是您想知道某个版本是否知足某个范围,可使用satisfies(version, range)
函数。
coerce(version, options)
: 若是可能,强制字符串semver这样作的目的是提供一个很是宽容的非semver字符串到semver的转换。它查找字符串中的第一个数字,并消耗至少知足部分分配器的全部其他字符(例如., 1
, 1.2
, 1.2.3
) 最大容许长度(256个字符)。较长的版本被简单地截断 (4.6.3.9.2-alpha2
变成4.6.3
). 全部周围的文本都被忽略了 (v3.4 replaces v3.3.1
变成3.4.0
). 只有缺乏数字的文本不能强制 (version one
无效). 考虑强制的任何semver组件的最大长度是16个字符;较长的组件将被忽略 (10000000000000000.4.7.4
变成4.7.4
). 任何semver组件的最大值为 Number.MAX_SAFE_INTEGER || (2**53 - 1)
; 更高值组件无效 (9999999999999999.4.7.4
多是无效的).
若是 options.rtl
标记已经设置了, 而后coerce
返回最右端的可压缩性元组,不与更长的可压缩性元组共享结束索引. 例如, 1.2.3.4
会返回 2.3.4
在 rtl 模式, 而不是4.0.0
. 1.2.3/4
会返回 4.0.0
, 由于4
不是任何其余重叠的SemVer元组的一部分。
clean(version)
: 若是可能的话,将字符串清除为有效的semver这将返回一个干净和修剪过的semver版本。若是提供的版本无效,将返回null。这对范围不适用。
ex.
s.clean(' = v 2.1.5foo')
: null
s.clean(' = v 2.1.5foo', { loose: true })
: '2.1.5-foo'
s.clean(' = v 2.1.5-foo')
: null
s.clean(' = v 2.1.5-foo', { loose: true })
: '2.1.5-foo'
s.clean('=v2.1.5')
: '2.1.5'
s.clean(' =v2.1.5')
: 2.1.5
s.clean(' 2.1.5 ')
: '2.1.5'
s.clean('~1.0.0')
: null
若是您对打包和树抖动问题很敏感,那么能够只使用这个semver实用程序的一部分。主要的require('semver')
导出使用getter函数惰性地加载所使用的API的部分。
如下模块可供选择:
require('semver')
require('semver/classes')
require('semver/classes/comparator')
require('semver/classes/range')
require('semver/classes/semver')
require('semver/functions/clean')
require('semver/functions/cmp')
require('semver/functions/coerce')
require('semver/functions/compare')
require('semver/functions/compare-build')
require('semver/functions/compare-loose')
require('semver/functions/diff')
require('semver/functions/eq')
require('semver/functions/gt')
require('semver/functions/gte')
require('semver/functions/inc')
require('semver/functions/lt')
require('semver/functions/lte')
require('semver/functions/major')
require('semver/functions/minor')
require('semver/functions/neq')
require('semver/functions/parse')
require('semver/functions/patch')
require('semver/functions/prerelease')
require('semver/functions/rcompare')
require('semver/functions/rsort')
require('semver/functions/satisfies')
require('semver/functions/sort')
require('semver/functions/valid')
require('semver/ranges/gtr')
require('semver/ranges/intersects')
require('semver/ranges/ltr')
require('semver/ranges/max-satisfying')
require('semver/ranges/min-satisfying')
require('semver/ranges/min-version')
require('semver/ranges/outside')
require('semver/ranges/to-comparators')
require('semver/ranges/valid')
基本经常使用的方法场景就这些了,更完整的用法能够直接查阅文档