ãã®èšäºã¯ BASE Advent Calendar 2021 ã® 5 æ¥ç®ã®èšäºã§ãã åºç€ããŒã ã®å³äº¬ã§ãã æè¿ã²ãããªããšãã browserslist ã®èšå®ãèŠè¿ããã®ã§ãããbabel ã autoprefixer ã§å¿
èŠã«ãªã£ãã®ã§å°å
¥ããã以äžã¯ããŸãè§ŠããããŠããªãã£ãããããã®æ©äŒã«ãã¡ããèŠçŽããŠã¿ãããšæããŸããã browserslist? https://github.com/browserslist/browserslist ç°¡åã«èšãã°ãã¯ãšãªãæžããšããã«è©²åœãããã©ãŠã¶ããªã¹ãã§ååŸã§ããŸããbabel(preset-env) ã autoprefixer ã¯ããããååŸåºæ¥ããªã¹ããå©çšããŠãå¿
èŠãªå€æå
å®¹ãæ±ºå®ããŠããŸããåçŽã«ããŒãžã§ã³æå®ã§ã®ã¯ãšãªãèšè¿°ã§ããã ãã§ã¯ãªããå©çšçµ±èšã«åºã¥ãçµã蟌ã¿ãå¯èœãšãªã£ãŠããŸããäŸãã°ã0.2% 以äžã®ã·ã§ã¢ããããã¡ã³ããã³ã¹ãè¡ãããŠãããã©ãŠã¶ã¯æ¬¡ã®ã¯ãšãªã§ååŸã§ããŸãã > 0.2%, not dead ãã®ã¯ãšãªã¯ package.json ã® browserslist ãšããŠæå®ãããã .browserslistrc ãäœæããŠèšè¿°ãããšèªèãããããã«ãªããŸããä»å㯠package.json ã«æžã圢ã§é²ããŸãã { " private ": true , " browserslist ": [ " > 0.2%, not dead " ] } ãã®ç¶æ
ã«ãªãã°ãã©ãŠã¶ã®ãªã¹ãã CLI ã JavaScript ã§ååŸã§ããŸãã詊ãã« CLI ã䜿ã£ãŠååŸããŠã¿ãŸãã $ npx browserslist and_chr 96 and_ff 94 and_uc 12.12 chrome 95 chrome 94 chrome 93 chrome 92 chrome 87 chrome 61 chrome 49 edge 95 edge 94 firefox 93 firefox 92 ie 11 ios_saf 15 ios_saf 14.5-14.8 ios_saf 14.0-14.4 ios_saf 13.4-13.7 ios_saf 12.2-12.5 ios_saf 9.0-9.2 opera 79 safari 15 safari 14.1 safari 14 safari 13.1 samsung 15.0 babel ããã®å©çš ååŸã§ãããªã¹ãã babel(preset-env) ãã©ã®ããã«å©çšããŠãããã確èªããŠã¿ãŸããå©çšã«ã¯ @babel/preset-env ãèšå®ããå¿
èŠãããã®ã§ãããã远å ããŠèšå®ããŸãã { "presets": ["@babel/preset-env"] } 次ã®ãããªã³ãŒããäŸã«èããŠã¿ãŸãããã®ã³ãŒãã¯å€ããã©ãŠã¶ã§ã¯ async/await ãå®è£
ãããŠããªãããããã®ãŸãŸã§ã¯åäœã§ããäœãããã®åœ¢ã«å€æãããå¿
èŠããããŸãã (async () => { const response = await fetch( 'https://api.github.com/users/yaakaito' ); console.log(response) } )() å
çšã® browserslist ã®çµæã«ã¯ async/await ãå®è£
ããŠããªã IE11 ãå«ãŸããŠãããããbabel ã§å€æãããšçœ®ãæãããããã¯ãã§ãã Async functions | Can I use... Support tables for HTML5, CSS3, etc > npx babel src/index.js "use strict"; function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { var response; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return fetch('https://api.github.com/users/yaakaito'); case 2: response = _context.sent; console.log(response); case 4: case "end": return _context.stop(); } } }, _callee); }))(); ãã®ããã« IE11 ã§ãåäœå¯èœãªã³ãŒãã«å€æãããŸãããã§ãããBASE ã§ã¯ IE11 ã®ãµããŒããçµäºããããã察象ãã©ãŠã¶ãã IE11 ãé€å€ããããšæããŸãããããã¯ãšãªãæžãããšã§è¡šçŸããããšãåºæ¥ãŸãã not IE 11 ã远å ããŸãã { " private ": true , " browserslist ": [ " > 0.2%, not dead ", " not IE 11 " ] } ãã®ç¶æ
ã§ babel ã§æ¹ããŠå€æãããšã察象ã«ããŠãããã©ãŠã¶ãã¹ãŠã§ async/await ãå®è£
ãããŠãããã倿ãäžèŠãšãªããåºåãããã³ãŒããå€åããŠããããšãããããŸãã $ npx babel src/index.js "use strict"; (async () => { const response = await fetch('https://api.github.com/users/yaakaito'); console.log(response); })(); BASE ã®èšå®ãèŠçŽã ããŠããã£ãããšãªã£ãä»çŸåš BASE ã§èšå®ãããŠãã browserslist ãèŠãŠãããŸããbrowserslist ã¯è€æ°ã®ãªããžããªã§å
±æããŠããããããã©ã€ããŒã㪠GitHub Packages ãšããŠé
ä¿¡ããŠããããã®ãããªåœ¢ã§å©çšã§ããããã«ããŠããŸãã " browserslist ": [ " extends @baseinc/browserslist-config " ] ãããŠãã®äžèº«ã¯...ã¡ãã£ãšé ãçããªãæãã§ããã ['ie >= 11', 'safari >= 7', 'iOS >= 10.0', 'and_chr >= 5.0', 'last 1 version', '> 1%'] and_chr 91 and_ff 89 and_qq 10.4 and_uc 12.12 android 91 baidu 7.12 bb 10 chrome 91 chrome 90 chrome 89 edge 91 edge 90 firefox 89 firefox 88 ie 11 ie_mob 11 ios_saf 14.5-14.6 ios_saf 14.0-14.4 ios_saf 13.4-13.7 ios_saf 13.3 ios_saf 13.2 ios_saf 13.0-13.1 ios_saf 12.2-12.4 ios_saf 12.0-12.1 ios_saf 11.3-11.4 ios_saf 11.0-11.2 ios_saf 10.3 ios_saf 10.0-10.2 kaios 2.5 op_mini all op_mob 62 opera 76 safari 14.1 safari 14 safari 13.1 safari 13 safari 12.1 safari 12 safari 11.1 safari 11 safari 10.1 safari 10 safari 9.1 safari 9 safari 8 safari 7.1 safari 7 samsung 14.0 æããã«å
容ãå€ãã®ã§ãçŸåšæšå¥šããŠããç°å¢ã«åãããŠã¯ãšãªãèŠçŽããŸãã 察å¿ããŠããå©çšç°å¢ã»ãã©ãŠã¶ã¯äœããããŸãã â ãã«ã | BASE ãããããšã«èãããšããã®ãããªã¯ãšãªãé©çšã§ãããã§ãã " browserslist ": [ " > 0.2%, not dead ", " not IE 11 ", " Safari > 11, iOS > 11 " ] ä»ã®ããŒã«ã«ã掻çšããã æè¿ãTypeScript ã®å€æãé床é¢ã®èª²é¡ãã tsc â esbuild ã«çœ®ãæããããšèããŠããŠãå®ã¯ä»åèŠçŽããã£ããã«ãªã£ãã®ãããã§ãããVue.js 2x ã§ã® TSX ãµããŒãã®ããã« Babel ãéãå¿
èŠãããã®ã§ããããã以å€ã®ãã®ã«é¢ããŠã¯ã§ããã° esbuild ã®ã¿ã§è§£æ±ºããããesbuild ã® target ã¯ãã©ãŠã¶ã®æå®ãå¯èœã§ãããbrowserslist ã«ã¯å¯Ÿå¿ããŠããŸããã esbuild - API Support browserslist · Issue #121 · evanw/esbuild ããã« browserslist ã䜿ããããã«ããŠã¿ãŸãããã¹ãŠå¯Ÿå¿ããããšãããšå€§å€ãªã®ã§ãããã§ã¯ chrome ã®ã¿ã§èããŸãã #!/usr/bin/env node const browserslist = require( 'browserslist' ); const { buildSync } = require( 'esbuild' ); const browsers = browserslist(); const target = [ browsers.reverse().find(t => t.startsWith( 'chrome' )).replace( ' ' , '' ) ] ; console.log(buildSync( { entryPoints: [ 'src/index.js' ] , target } )) ç°¡æçã§ãããbrowserslist ã«å«ãŸããŠãã chrome ã®äžçªå€ãããŒãžã§ã³ã esbuild ã§è§£éã§ãã圢ã«å€æããŠããŸããããããã«ãããŠã¿ããšãå
çšãšåãçµæã«ãªããŸãã > ./build.js { errors: [], warnings: [] } (async () => { const response = await fetch("https://api.github.com/users/yaakaito"); console.log(response); })(); 詊ãã« async/await ãå®è£
ãããŠããªãããŒãžã§ã³(chrome54)ãå«ãŸããã¯ãšãªã«å€æŽããŠã¿ãŸãã " browserslist ": [ " > 0.2%, not dead ", " chrome 54 ", " not IE 11 ", " Safari > 11, iOS > 11 " ] > ./build.js { errors: [], warnings: [] } var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; (() => __async(this, null, function* () { const response = yield fetch("https://api.github.com/users/yaakaito"); console.log(response); }))(); yield ã䜿ã£ãçµæã«å€åããŸãããç°¡åã«ã§ã¯ãããŸãããbrowserslist ãã esbuild ã®èšå®ãã§ããããã«ãªããŸããã ãããã« ãªããšãªãèšå®ããŠãã browserslist ã§ãããæåããèŠçŽããŠã¿ãããšã§èããããæŽ»çšã®å¹
ãåºãã£ãããã«æããŸãã ä»åã¯ããã§ã«æ²èŒããŠããæšå¥šç°å¢ããã¯ãšãªãéç®ããŸããããé¢ä¿ãå
¥æ¿ã㊠browserslist ããæšå¥šãã©ãŠã¶ãçæãæŽæ°ãåèªååãããããªéçšãèãããããã§ãã ææ¥ã¯ @rry ã§ãããæ¥œãã¿ã«ïŒ