1. 程式人生 > >javascript-browserslist-在不同的前端工具間共享目標瀏覽器

javascript-browserslist-在不同的前端工具間共享目標瀏覽器

javascript browserslist - 在不同的前端工具(Autoprefixer, Stylelint, babel-preset-env)之間共享目標瀏覽器。

github地址:
	https://github.com/browserslist/browserslist

官網:
	https://twitter.com/browserslist

瀏覽器檢測網站:
	https://caniuse.com

browserslist 字串,查詢到的瀏覽器列表,以及市場總的佔有率檢視
	https://browserl.ist


文件翻譯:
	可用於:
		Autoprefix
		Babel
		...

	每個工具如何使用 browserslist 的示例,可以在下面連結檢視:
		https://github.com/browserslist/browserslist-example

	當我們在 'package.json' 檔案中,新增合適的配置,所有工具將會自動發現目標瀏覽器:
		{
			"browserslist": [
				"last 1 version",
				"> 1%",
				"maintained node versions",
				"not dead"
			]	
		}

	或者在 '.browserslistrc' 檔案來配置:
		last 1 version
		> 1%
		maintained node versions
		not dead

	我們可以在查詢中(例如:last 2 version),設定版本列表,從而避免了手動更新版本。Browserslist 會從 'Can I Use' 網站(http://caniuse.com/),進行查詢,從而篩選出指定的版本。

	Browserslist 可以從 '工具選項'、 'browserslist' 配置、'.browserslistrc' 配置、'package.json 中的 browserslist 片段' 或 '環境變數' 來設定查詢。

	我們可以在 'https://browserl.ist' 測試 Browserslist 的查詢。

	工具:
		browserslist-ga - 下載您的網站的瀏覽器統計資訊,用於在 '> 0.5% in my stats' 查詢字串進行查詢

		browserslist-useragent - 通過 user agent 來檢查瀏覽器,來匹配 Browserslist 目標瀏覽器查詢

		browserslist-useragent-ruby - 同上,不過是基於 ruby

		caniuse-api - 返回支援某些特定功能的瀏覽器

		在專案目錄執行 npx browserslist,來檢視專案的目標瀏覽器。該 CLI 工具是內建的,並且在任意的 'Autoprefix' 專案裡都可用。

	查詢:
		Browserslist 可以從以下的來源,進行查詢,來使用瀏覽器和 Node.js 版本:
			1.當前目錄或父級目錄的 package.json 檔案裡的 browserslist 鍵。(推薦使用此方法)
			2.工具選項。例如,在 Autoprefix 中的 browsers 選項。
			3.BROWSERSLIST 環境變數
			4.當前目錄或父級目錄的 browserslist 配置檔案
			5.當前目錄或父級目錄的 .browserslistrc 配置檔案
			6.如果以上方法不能產生一個有效的解決,Bro	wserslist 將預設使用:> 0.5%, last 2 versions, Firefox ESR, not dead。

		最佳實踐
			1.僅當我們專門為一個瀏覽器終端建立 web app時,才直接使用瀏覽器(last 2 Chrome versions)。市場上有很多瀏覽器。如果我們正在建立一個通用的 web app,我們應該尊重瀏覽器的多樣性。

			2.如果你想更改瀏覽器的預設集合,我們建議將 last 1 version、not dead 和 > 0.2%(或 > 1% in US, > 1% in my stats) 結合起來使用。'last n versions' 添加了太多的死瀏覽器,並未新增流行的舊版瀏覽器。> 0.2% 使得流行瀏覽器更受歡迎,這樣,我們將會有壟斷(monopoly)和停滯(stagnation),就像我們使用 IE6 一樣。

			3.不要僅因為您不瞭解瀏覽器而刪除它們。 Opera Mini 在非洲擁有1億使用者,它在全球市場上比 Microsoft Edge 更受歡迎。QQ 瀏覽器的市場份額比 Firefox 和桌面 Safari 都要多。

		全部列表
			我們可以通過以下查詢條件,來執行瀏覽器和 Node.js 版本(忽略大小寫):
				> 5% - 根據全球使用統計來選擇瀏覽器版本。也可以使用 '>=', '<', '<='。
				> 5% in US - 使用 USA 的使用統計。接受 '2個字母的國家/地區程式碼'。(https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements)
				> 5% in alt-AS - 使用 alt-AS (alt-AS - 亞洲區域)的使用統計。所有的地區程式碼可在後面連結找到。(https://github.com/ben-eb/caniuse-lite/tree/master/data/regions)
				> 5% in my stats - 使用 '自定義使用資料'
				cover 99.5% - 基於覆蓋率
				cover 99.5% in US
				cover 99.5% in my stats
				maintained node versions - 所有 Node.js 版本,仍然由 Node.js 基金會維護(https://github.com/nodejs/Release)
				node 10 和 node 10.4 - 選擇最新的 Node.js 10.x.x 或 10.4.x 釋出版
				current node - Browserslist 目前使用的 Node.js 版本
				extends browserslist-config-mycompany - 從 'browserslist-config-mycompany' npm 包獲取查詢字串
				ie 6-8 - 選擇一個範圍的版本
				Firefox > 20 - 高於 20 版本的火狐。也可以使用 '>=', '<', '<='。
				iOS 7 - 直接指定 iOS 瀏覽器版本 7。
				Firefox ESR - 最新的 [火狐 ESR] 版本。
				unreleased versions 或 unreleased Chrome versions - alpha 和 beta 版本。
				last 2 major versions 或 last 2 iOS major versions - 最近2個主版本的所有次要(minor)/補丁(patch)版本。
				since 2015 或 last 2 years - 2015 年起釋出的所有版本。(也可以是 since 2015-03 或 since 2015-03-11)
				dead - last 2 versions, < 5%,並且24個月內官方未提供支援或更新。目前有:IE 10, IE_Mob 10, BlackBerry 10, BlackBerry 7, OperaMobile 12.1。
				last 2 versions - 每個瀏覽器最新的2個版本
				last 2 Chrome versions - Chrome 瀏覽器最新的2個版本
				defaults - Browserslist 的預設瀏覽器查詢字串(> 0.5%, last 2 versions, Firefox ESR, not dead)
				not ie <= 8 - 排除所有低於 ie 8 的版本

			我們可以給任何查詢前,新增 not

		除錯
			在專案目錄,執行 npx browserslist,來檢視我們的查詢條件,都選擇了哪些瀏覽器
				npx browserslist

		注意
			Browserslist 適用於不同版本的瀏覽器。應該避免類似:Firefox > 0 這種查詢。

			多查詢,使用 'OR' 來組合。瀏覽器版本必須匹配至少一個查詢。

			所有查詢都是基於 'Can I Use' 支援的資料,例如:last 3 iOS versions,可能選中 8.4、9.2、9.3(主版本和次版本混合),而 last 3 Chrome versions 可能選中 50、49、48(只有主版本)

		瀏覽器
			Android
			Baidu
			BlackBerry 或 bb
			Chrome
			ChromeAndroid 或 and_chr
			Edge
			Electron
			Explorer 或 ie
			ExplorerMobile 或 ie_mob
			Firefox 或ff
			FirefoxAndroid 或 and_ff
			iOS 或 ios_saf
			Node
			Opera
			OperaMini 或 op_mini
			OperaMobile 或 op_mob
			QQAndroid 或 and_qq
			Safari
			Samsung
			UCAndroid 或 and_uc

	package.json
		如果想在專案根目錄,減少配置檔案,可以在 package.json 的 browserslist 欄位進行配置
			{
			  	"private": true,
			  	"dependencies": {
			    	"autoprefixer": "^6.5.4"
			  	},
			  	"browserslist": [
			    	"last 1 version",
			    	"> 1%",
			    	"IE 10"
			  	]
			}

	配置檔案
		Browserslist 配置檔案,應該命名為 .browserslistrc 或 browserslist,檔案內每行只能寫一個查詢條件
			last 1 version
			> 1%
			IE 10

		Browserslist 會檢查 'path' 路徑下的每個目錄,來搜尋配置檔案。因此,如果工具處理 'app/styles/main.css',我們可以將配置檔案放在 app/ 或 app/styles

		我們可以在 BROWSERSLIST_CONFIG 環境變數,來指定上面提到的 'path' 路徑。

	可共享的配置
		我們可以使用下面的查詢,從另一個包匯入 Browserslist 配置:
			"browserslist": [
				"extends browserslist-config-mycompany"
			]

		出於安全考慮,外部配置僅支援具有 'browserslist-config-' 字首的包。通過使用 '@scope/browserslist-config' 命名或者字首化模組,也支援 npm 範圍包(npm scoped packages),例如:@scope/browserslist-config 或 @scope/browserslist-config-mycompany。

		如果你不接受來自使用者的瀏覽器查詢,可以通過使用 'dangerousExtend' 選項來禁用驗證:
			browserslist(queries, { path, dangerousExtend: true })

		由於這種方式使用了 npm 解析,我們還可以引用指定包的指定檔案:
			"browserslist": [
			    "extends browserslist-config-mycompany/desktop",
			    "extends browserslist-config-mycompany/mobile"
			]

		當編寫共享的 browserslist 包時,只需要匯出一個數組。browserslist-config-mycompany/index.js:
			module.exports = [
			  	'last 1 version',
			  	'> 1%',
			  	'ie 10'
			]

	環境變數
		如果某些工具內部使用 Browserslist,我們可以通過設定 '環境變數' 來改變瀏覽器設定:

			BROWSERSLIST - 指定瀏覽器查詢條件
				BROWSERSLIST="> 5%" gulp css

			BROWSERSLIST_CONFIG - 指定配置檔案路徑
				BROWSERSLIST_CONFIG=./config/browserslist gulp css

			BROWSERSLIST_ENV - 指定所處環境
				BROWSERSLIST_ENV="development" gulp css

			BROWSERSLIST_STATS - 指定 '> 1% in my stats' 查詢,所參考的自定義的使用資料的路徑(以後使用 in my stats,將會根據該檔案的資料來查詢瀏覽器)
				BROWSERSLIST_STATS=./config/usage_data.json gulp css

			BROWSERSLIST_DISABLE_CACHE - 禁用從快取中讀取配置
				BROWSERSLIST_DISABLE_CACHE=1 gulp css

	環境
		我們也可以為不同的環境指定不同的瀏覽器查詢。Browserslist 會根據 'BROWSERSLIST_ENV' 或 'NODE_ENV' 變數來選擇查詢條件。如果沒有宣告不同環境的查詢條件,Browerslist 將首先查詢 'production' 環境的查詢條件,沒有的話,則使用預設。

		在 package.json 檔案:
			"browserslist": {
			    "production": [
			      	"> 1%",
			      	"ie 10"
			    ],
			    "development": [
			      	"last 1 chrome version",
			      	"last 1 firefox version"
			    ]
			}

		在 .browserslistrc 配置檔案:
			[production staging]
			> 1%
			ie 10

			[development]
			last 1 chrome version
			last 1 firefox version

	自定義使用資料
		如果你有自己的網站,則可以根據網站的使用情況的統計來查詢。'browserslist-ga' 要求訪問 Google Analytics,然後生成 browserslist-stats.json:
			npx browserslist-ga

		當然,你可以通過其他任何方法來生成使用情況統計檔案。檔案格式應該如下:
			{
			  	"ie": {
			    	"6": 0.01,
			    	"7": 0.4,
			    	"8": 1.5
			  	},
			  	"chrome": {
			    	…
			  	},
			  	…
			}

		注意,我們可以在使用自定義使用資料查詢的同時,結合其他查詢。例如:> 1% in my stats, > 5% in US, 10%。

	JS API
		var browserslist = require('browserslist');

		// Your CSS/JS build tool code
		var process = function (source, opts) {
		    var browsers = browserslist(opts.browsers, {
		        stats: opts.stats,
		        path:  opts.file,
		        env:   opts.env
		    });
		    // Your code to add features for selected browsers
		}

		查詢字串可以是字串("> 1%, IE 10")或陣列格式(['> 1%', 'IE 10'])。

		如果沒有指定查詢字串,Browserslist 將查詢配置檔案。我們可以提供一個 'path' 選項(這可以是一個檔案),相對它的路徑來查詢配置檔案。

		選項:
			path - 用於查詢配置檔案的檔案或目錄路徑。預設是 '..'
			env - 使用配置的環境。預設是 'production'
			stats - 自定義的使用情況統計資料
			config - 手動設定的配置路徑
			ignoreUnknownVersions - 不要直接給出查詢字串(例如:ie 12),是 boolean 型別。預設是 false
			dangerousExtend - 禁用 'extend' 查詢的安全檢查。預設是 false

		對於 '非-JS' 環境的除錯,可以使用 CLI 工具:
			browserslist "> 1%, IE 10"

	覆蓋率
		可以通過 JS API 獲得所選瀏覽器的總使用者的覆蓋率:
			browserslist.coverage(browserslist('> 1%'))
			browserslist.coverage(browserslist('> 1% in US'), 'US')
			browserslist.coverage(browserslist('> 1% in my stats'), 'my stats')
			browserslist.coverage(browserslist('> 1% in my stats', { stats }), stats)

		或者通過 CLI 來獲取:
			browserslist --coverage "> 1%"	
			browserslist --coverage=US "> 1% in US"
			browserslist --coverage "> 1% in my stats"
			browserslist --coverage "> 1% in my stats" --stats=./stats.json

	快取
		Browserslist 在託管期間,從 package.json 和 browserslist 配置檔案讀取配置並快取。

		清除這些快取,使用:
			browserslist.clearCaches();

		要完全禁用快取,設定 'BROWSERSLIST_DISABLE_CACHE' 環境變數=1