nodejs交互工具庫 -- resolve和semver

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和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交互工具庫 -- ora和envinfo算法

nodejs交互工具庫 -- memfs和execanpm

nodejs交互工具庫 -- webpack-merge和webpack-chain編程

nodejs交互工具庫 -- strip-ansi, address, default-gateway和joijson

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

resolve

實現node的 require.resolve()算法,這樣就能夠異步和同步地使用require.resolve()表明文件

example

異步解析:

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

methods

var resolve = require('resolve');

對於同步和異步方法,錯誤可能具備如下任何一種err.code

  • MODULE_NOT_FOUND: 給定的路徑字符串 (id) 沒法解析到模塊
  • INVALID_BASEDIR: 指定的 opts.basedir 不存在,或者不是目錄
  • INVALID_PACKAGE_MAIN: package.json 遇到了一個無效的 main 屬性(如。不是一個字符串)

resolve(id, opts={}, cb)

異步解析模塊路徑字符串 idcb(err, res [, pkg]), pkg(若是定義)是來自的數據 package.json.

選項有:

  • opts.basedir - 要開始解析的目錄
  • opts.package - package.json 能應用被加載模塊的數據
  • opts.extensions - 要按順序搜索的文件擴展名數組
  • opts.readFile - 如何異步讀取文件
  • opts.isFile - 函數異步測試文件是否存在
  • opts.isDirectory - 函數異步測試文件是否存在,是否爲目錄
  • opts.realpath - 函數異步地解決到其實際路徑的潛在符號連接
  • opts.packageFilter(pkg, pkgfile, dir) - 在查看「main」字段以前先轉換已解析的package.json內容

    • pkg - package 數據
    • pkgfile - package.json路徑
    • dir - 目錄包含package.json
  • opts.pathFilter(pkg, path, relativePath) - 轉換包中的路徑

    • pkg - package 數據
    • path -要解析的路徑
    • relativePath - 相對於package.json的位置
    • returns - 鏈接package.json位置的相對路徑
  • opts.paths - require.paths數組使用,若是沒有找到正常 node_modules 遞歸遍歷(可能不用這個)

    對於高級用戶, paths 也能夠是 opts.paths(request, start, opts) 函數

    • request - 正在解析的導入說明符
    • start - 查找路徑
    • getNodeModulesDirs - 一個thunk(無參數函數),使用標準返回路徑 node_modules 解決方案
    • opts - 解決方案選項
  • opts.packageIterator(request, start, opts) - 返回能夠找到包源的候選路徑列表(可能不使用這個)

    • request - 正在解析的導入說明符
    • start - 查找路徑
    • getPackageCandidates - 一個thunk(無參數函數),使用標準返回路徑 node_modules 解決方案
    • opts - 解決方案選項
  • opts.moduleDirectory - 在其中遞歸查找模塊的目錄(或多個目錄)。默認的: "node_modules"
  • opts.preserveSymlinks - 若是爲真,則在解析以前不說basedir解析爲實際路徑。當使用。執行時,這就是Node解析依賴項的方式 --preserve-symlinks 標記.

默認 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
}

resolve.sync(id, opts)

同步解析模塊路徑字符串id,返回結果並在id沒法解析時拋出錯誤。

選項有:

  • opts.basedir - 要開始解析的目錄
  • opts.extensions - 要按順序搜索的文件擴展名數組
  • opts.readFile - 如何同步讀取文件
  • opts.isFile - 函數同步測試文件是否存在
  • opts.isDirectory - 函數同步測試文件是否存在且是不是目錄
  • opts.realpathSync - 函數同步解析到其實際路徑的潛在符號連接
  • opts.packageFilter(pkg, pkgfile, dir) - 轉換解析後package.json內容,而後查看「main」字段

    • pkg - package 數據
    • pkgfile - package.json路徑
    • dir - 目錄包含package.json
  • opts.pathFilter(pkg, path, relativePath) - 轉換包中的路徑

    • pkg - package 數據
    • path - 要解析的路徑
    • relativePath - 相對於package.json的位置
    • returns - 鏈接package.json位置的相對路徑
  • opts.paths - require.paths數組使用,若是沒有找到正常 node_modules 遞歸遍歷(可能不用這個)

    對於高級用戶, paths 也能夠是 opts.paths(request, start, opts) 函數

    • request - 正在解析的導入說明符
    • start - 查找路徑
    • getNodeModulesDirs - 一個thunk(無參數函數),使用標準返回路徑 node_modules 解決方案
    • opts - 解決方案選項
  • opts.packageIterator(request, start, opts) - 返回能夠找到包源的候選路徑列表(可能不使用這個)

    • request - 正在解析的導入說明符
    • start - 查找路徑
    • getPackageCandidates - 一個thunk(無參數函數),使用標準返回路徑 node_modules 解決方案
    • opts - 解決方案選項
  • opts.moduleDirectory - 在其中遞歸查找模塊的目錄(或多個目錄)。默認的: "node_modules"
  • opts.preserveSymlinks - 若是爲真,則在解析以前不說basedir解析爲實際路徑。當使用。執行時,這就是Node解析依賴項的方式 --preserve-symlinks 標記.

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
}

install

yarn add resolve

參考

基本經常使用的方法場景就這些了,更完整的用法能夠直接查閱文檔

resolve

semver

npm的語義版本器

Install

yarn add semver

Usage

做爲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)

若是任何有效版本知足全部提供的範圍,程序將成功退出,並打印全部知足的版本。
若是沒有找到滿意的版本,則退出失敗。
版本是按升序打印的,所以向實用程序提供多個版本只是對它們進行排序。

Versions

「version」由在https://semver.org/找到的v2.0...

開頭的 「=」「v」字符被刪除並忽略。

Ranges

version range 是一套 comparators 指定知足範圍的版本。

comparatoroperatorversion組成。原始運算符集合爲:

  • < 小於
  • <= 小於或等於
  • > 大於
  • >= 大於或等於
  • = 平等的。若是沒有指定操做符,則假定相等,所以該操做符是可選的,但能夠包含其中。

例如, comparator >=1.2.7 將匹配版本1.2.7, 1.2.8, 2.5.3, 和1.3.9, 但不是版本 1.2.61.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.82.0.0.

Prerelease Tags

若是一個版本有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版本視爲正常版本,以便進行範圍匹配)。

Prerelease Identifiers

.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

Advanced Range Syntax

高級範圍語法以肯定的方式轉換爲基本比較器。

高級範圍能夠像原始比較器同樣使用空格或 ||組合。

Hyphen Ranges 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

X-Ranges 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

Tilde Ranges ~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]元組的預發行。

Caret Ranges ^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.40.3.0 發佈管理之間插入符號範圍是理想的, 這是一種常見的作法. However, 它假定 0.2.40.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

缺失的 minorpatch 值將退化爲零,但也容許在這些值中保持靈活性,即便主版本爲零。

  • ^1.x := >=1.0.0 <2.0.0-0
  • ^0.x := >=0.0.0 <1.0.0-0

Range Grammar

把全部這些放在一塊兒,下面是一個用於範圍的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]+

Functions

全部方法和類都採用最終的options對象參數。此對象中的全部選項默認爲 false。支持的選項有:

  • loose 對不徹底有效的semver字符串更加寬容。(固然,任何結果輸出都是100%嚴格兼容的。)因爲向後兼容性的緣由,若是options參數是一個布爾值而不是一個對象,它將被解釋爲鬆散參數。
  • includePrerelease設置爲禁止從範圍中排除預先標記的版本的默認行爲,除非它們被顯式地選擇。

嚴格模式比較器和範圍對於解析的SemVer字符串是嚴格的。

  • valid(v): 返回解析後的版本,若是無效則返回null
  • inc(v, release): 返回按發佈類型遞增的版本 (major, premajor, minor, preminor, patch, prepatch, 或者prerelease), 或null,若是它無效

    • premajor 在一個調用中會將版本提高到下一個主版本並下降到主版本的預發行版. preminor, 和prepatch 以一樣的方式工做。
    • 若是從非預發行版本調用 , prereleaseprepatch同樣的運做. 它增長補丁版本,而後製做預發行版。若是輸入的版本已是預發行版本,它就會增長它。
  • 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.

Comparison

  • 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。

Comparators

  • intersects(comparator): 若是比較器相交,返回true

Ranges

  • validRange(range): 返回有效範圍,若是無效則返回null
  • satisfies(version, range): 若是版本知足範圍,則返回true。
  • maxSatisfying(versions, range): 返回列表中知足範圍的最高版本,若是沒有一個版本知足範圍,則返回null
  • minSatisfying(versions, range): 返回列表中知足範圍的最低版本,若是沒有一個版本知足範圍,則返回null。
  • minVersion(range): 返回可能與給定範圍匹配的最低版本。
  • gtr(version, range): 若是版本大於範圍內全部可能的版本,則返回true。
  • ltr(version, range): 若是版本小於範圍內全部可能的版本,則返回true。
  • outside(version, range, hilo): 若是版本在高方向或低方向超出範圍的範圍,則返回true。hilo參數必須是字符串 '>''<'。(這是gtrltr調用的函數。)
  • intersects(range): 若是任何一個範圍比較器相交,返回true
  • simplifyRange(versions, range): 返回一個「簡化」範圍,該範圍匹配版本列表中指定的相同項。注意,它並不保證在全部狀況下都匹配相同的版本,只對提供的一組版本進行匹配。這在經過編程方式將多個版本與||結合在一塊兒生成範圍時很是有用,能夠爲用戶提供一些更符合人體工程學的東西。若是提供的範圍的字符串長度小於生成的範圍,則返回該範圍。
  • subset(subRange, superRange): 若是子程序範圍徹底包含在超範圍範圍內,則返回true。

注意,因爲範圍多是非連續的,版本可能不大於範圍、小於範圍或知足範圍!例如,範圍 1.2 <1.2.9 || >2.0.01.2.92.0.0會有一個洞,因此 1.2.10版本不會大於範圍(由於2.0.1知足,較高),也不到範圍(由於1.2.8知足,這是低),並且它也不知足。

若是您想知道某個版本是否知足某個範圍,可使用satisfies(version, range)函數。

Coercion

  • 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

  • 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

Exported Modules

若是您對打包和樹抖動問題很敏感,那麼能夠只使用這個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')

參考

基本經常使用的方法場景就這些了,更完整的用法能夠直接查閱文檔

node-semver

相關文章
相關標籤/搜索