ÎÒÔÚÕâ¸öÎÊÌâÉϼû¹ýºÜ¶àÀ§»ó£¬¼´Ê¹ÊǺÜÓоÑéµÄ JavaScript ¿ª·¢ÕßÒ²¿ÉÄÜÄÑÒÔ°ÑÎÕÆäÖеÄÇÉÃîÖ®´¦¡£Òò´ËÎÒÈÏΪֵµÃΪËüÊéдһС¶Î½Ì³Ì¡£

¼ÙÉèÄãÓÐÒ»¸ö JavaScript µÄÄ£¿éÏëÒª·¢²¼µ½ npm ÉÏ£¬ËüÊÇͬʱÊÊÓÃÓÚ Node ºÍä¯ÀÀÆ÷µÄ¡£µ«ÊÇÇë×¢Ò⣡Õâ¸öÌØÊâµÄÄ£¿éÔÚ
Node °æ±¾ºÍä¯ÀÀÆ÷°æ±¾ÉϵÄʵÏÖÓÐ×Åϸ΢µÄÇø±ð¡£
ÕâÖÖÇé¿ö³öÏÖµÃʵÔÚÆµ·±£¬ÒòΪÔÚ Node ºÍä¯ÀÀÆ÷¼äÓÐןܶà΢СµÄ»·¾³²î±ð¡£ÔÚÕâÖÖÇé¿öÏ£¬¿ÉÒÔÓñȽÏÇÉÃîµÄ·½·¨À´ÕýÈ·µØÊµÏÖ£¬ÓÈÆäÊǵ±ÄãÔÚ³¢ÊÔ×ÅʹÓÃ×îСµÄ
browser °ü£¨bundle£©À´ÓÅ»¯µÄʱºò¡£
ÈÃÎÒÃǹ¹½¨Ò»¸ö JS °ü
Òò´ËÈÃÎÒÃÇÀ´Ð´Ò»¸öСµÄ JavaScript °ü£¬½Ð×ö base64-encode-string¡£ËüËù×öµÄÖ»ÊǽÓÊÕÒ»¸ö×Ö·û´®×÷ΪÊäÈ룬Êä³öÆä
base64 ±àÂëµÄ°æ±¾¡£
¶ÔÓÚä¯ÀÀÆ÷À´Ëµ£¬ÕâºÜ¼òµ¥£ºÎÒÃÇÖ»ÐèҪʹÓÃ×Ô´øµÄ btoa º¯Êý£º
module.exports = function (string) { return btoa(string); }; |
È»¶øÔÚ Node ÀﲢûÓÐ btoa º¯Êý¡£Òò´Ë£¬×÷ÎªÌæ´ú£¬ÎÒÃÇÐèÒª×Ô¼º´´½¨Ò»¸ö Buffer£¬È»ºóÔÚÉÏÃæµ÷ÓÃ
buffer.toString()£º
module.exports = function (string) { return Buffer.from(string, 'binary').toString('base64'); }; |
¶ÔÓÚÒ»¸ö×Ö·û´®£¬ÕâÁ½Õß¶¼Ó¦ÌṩÆäÕýÈ·µÄ base64 ±àÂë°æ±¾£¬±ÈÈ磺
var b64encode = require('base64-encode-string'); b64encode('foo'); // Zm9v b64encode('foobar'); // Zm9vYmFy |
ÏÖÔÚÎÒÃÇÖ»ÐèҪһЩ·½·¨À´¼ì²âÎÒÃǾ¿¾¹ÊÇÔÚä¯ÀÀÆ÷ÉÏÔËÐл¹ÊÇÔÚ Node ÉÏ£¬ºÃÈÃÎÒÃÇÄܱ£Ö¤Ê¹ÓÃÕýÈ·µÄ°æ±¾¡£Browserify
ºÍ Webpack ¶¼¶¨ÒåÁËÒ»¸ö½Ð process.browser µÄ×ֶΣ¬Ëü»á·µ»Ø true£¨ÒëÕß×¢£º¼´ä¯ÀÀÆ÷»·¾³Ï£©£¬È»¶øÔÚ
Node ÉÏÕâ¸ö×ֶηµ»Ø false¡£ËùÒÔÎÒÃÇÖ»ÐèÒª¼òµ¥µØ£º
if (process.browser) { module.exports = function (string) { return btoa(string); }; } else { module.exports = function (string) { return Buffer.from(string, 'binary').toString('base64'); }; } |
ÏÖÔÚÎÒÃÇÖ»ÐèÒª°ÑÎÒÃǵÄÎļþÃüÃûΪ index.js£¬¼üÈë npm publish£¬ÎÒÃǾÍÍê³ÉÁË£¬¶Ô²»¶Ô£¿ºÃµÄ°É£¬Õâ¸ö·½·¨ÓÐЧ£¬µ«²»ÐÒµÄÊÇ£¬ÕâÖÖʵÏÖÓÐÒ»¸ö¾Þ´óµÄÐÔÄÜÎÊÌâ¡£
ÒòΪÎÒÃÇµÄ index.js Îļþ°üº¬ÁË¶Ô Node ×Ô´øµÄ process ºÍ Buffer Ä£¿éµÄÒýÓã¬Browserify
ºÍ Webpack ¶¼»á×Ô¶¯ÒýÈë Æä polyfill£¬À´½«ËüÃÇ´ò°ü½øÕâЩģ¿é¡£
¶ÔÓÚÕâ¸ö¼òµ¥µÄ¾ÅÐÐÄ£¿é£¬ÎÒËãÁËһϣ¬ Browserify ºÍ Webpack »á´´½¨ Ò»¸öѹËõºóÓÐ 24.7KB
µÄ°ü (7.6KB min+gz)¡£¶ÔÓÚÕâÖÖ¶«Î÷£¬ÓõôµÄ¿Õ¼äʵÔÚÊÇÌ«¶à£¬ÒòΪÔÚä¯ÀÀÆ÷ÀֻÐèÒª btoa
¾ÍÄܱíʾÕâ¸ö¡£
¡°browser¡± ×ֶΣ¬ÎÒ¸ÃÈçºÎ°®Äã
Èç¹ûÄãÔÚ Browserify »òÕß Webpack ÎĵµÀïÕÒ½â¾öÕâ¸öÎÊÌâµÄÌáʾ£¬Äã¿ÉÄÜ×îºó»á·¢ÏÖ node-browser-resolve¡£ÕâÊÇÒ»¸ö¶ÔÓÚ
package.json ÄÚ "browser" ×ֶεĹ淶£¬¿ÉÒÔ±»ÓÃÓÚ¶¨ÒåÔÚä¯ÀÀÆ÷°æ±¾¹¹½¨Ê±ÐèÒª±»»»µôµÄ¶«Î÷¡£
ʹÓÃÕâÖÖ¼¼Êõ£¬ÎÒÃÇ¿ÉÒÔ½«½ÓÏÂÀ´Õâ¶Î¼ÓÈëÎÒÃÇµÄ package.json£º
{ /* ... */ "browser": { "./index.js": "./browser.js" } } |
È»ºó½«º¯Êý·Ö¸î³ÉÁ½¸ö²»Í¬µÄÎļþ£ºindex.js ºÍ browser.js£º
// index.js module.exports = function (string) { return Buffer.from(string, 'binary').toString('base64'); }; // browser.js module.exports = function (string) { return btoa(string); }; |
ÓÐÁËÕâ´Î¸Ä½øÒÔºó£¬Browserify ºÍ Webpack »á¸ø³ö ¸ü¼ÓºÏÀíµÄ°ü£ºBrowserify
µÄ°üѹËõºóÊÇ 511 ×Ö½Ú£¨315 min+gz)£¬Webpack µÄ°üѹËõºóÊÇ 550 ×Ö½Ú£¨297
min+gz£©¡£
µ±ÎÒÃǽ«ÎÒÃǵİü·¢²¼µ½ npm ʱ£¬ÔÚ Node ÀïÔËÐÐ require('base64-encode-string')
µÄÈ˽«µÃµ½ Node °æµÄ´úÂ룬ÔÚ Browserfy ºÍ Webpack ÀïÅܵÄÈË»áµÃµ½ä¯ÀÀÆ÷°æµÄ´úÂë¡£
¶ÔÓÚ Rollup À´Ëµ£¬Õâ¾ÍÓе㸴ÔÓÁË£¬µ«Ò²²»ÐèҪ̫¶à¶îÍâµÄ¹¤×÷¡£Rollup Óû§ÐèҪʹÓà rollup-plugin-node-resolve
²¢ÔÚÑ¡ÏîÀォ browser ÉèÖÃΪ true¡£
¶Ô jspm À´Ëµ£¬ºÜ²»Ðҵأ¬Ã»ÓÐ¶Ô ¡°browser¡± ×ֶεÄÖ§³Ö£¬µ«ÊÇ jspm Óû§¿ÉÒÔͨ¹ý require('base64-encode-string/browser')
»òÕß jspm install npm:base64-encode-string -o "{main:'browser.js'}"
À´Óػصؽâ¾öÎÊÌâ¡£ÁíÒ»ÖÖ·½·¨ÊÇ£¬°üµÄ×÷Õß¿ÉÒÔÔÚËûÃÇµÄ package.json Àï Ö¸¶¨Ò»¸ö ¡°jspm¡±
×ֶΡ£
½ø½×¼¼ÇÉ
ÕâÖÖÖ±½ÓʹÓÃµÄ "browser" ·½·¨¿ÉÒÔ¹¤×÷µÃºÜºÃ£¬µ«ÊǶÔÓÚ´óÐÍÏîÄ¿À´Ëµ£¬ÎÒ·¢ÏÖËüÔÚ
package.json ºÍ´úÂë¿â¼äÒýÈëÁËÒ»ÖÖÞÏÞεÄñîºÏ¡£±ÈÈç˵£¬ÎÒÃÇµÄ package.json »áºÜ¿ì³¤³ÉÕâÑù£º
{ /* ... */ "browser": { "./index.js": "./browser.js", "./widget.js": "./widget-browser.js", "./doodad.js": "./doodad-browser.js", /* etc. */ } } |
ÔÚÕâÖÖÇé¿öÏ£¬ÈκÎʱºòÄãÏëÒªÒ»¸öÊÊÅäÓÚä¯ÀÀÆ÷µÄÄ£¿é£¬¶¼ÐèÒª·Ö±ð´´½¨Á½¸öÎļþ£¬²¢ÇÒÒª¼ÇסÔÚ "browser"
×Ö¶ÎÉÏÌí¼Ó¶îÍâÐÐÀ´½«ËüÃÇÁ¬½ÓÆðÀ´¡£»¹Òª×¢Òâ²»ÄÜÆ´´íÈκζ«Î÷£¡
²¢ÇÒ£¬Äã»á·¢ÏÖÄãÔڷѾ¡ÐÄ»úµØ½«Î¢Ð¡µÄ´úÂëÌáÈ¡µ½·ÖÀëµÄÄ£¿éÀ½ö½öÊÇÒòΪÄãÏëÒª±ÜÃâ if (process.browser)
{} ¼ì²é¡£µ±ÕâЩ *-browser.js Îļþ»ýÀÛÆðÀ´µÄʱºò£¬ËüÃǻῪʼÈôúÂë¿â±äµÃºÜÄÑÌø×ª¡£
Èç¹ûÕâÖÖÇé¿ö±äµÃʵÔÚÌ«±¿ÖØÁË£¬ÓÐһЩ±ðµÄ½â¾ö·½°¸¡£ÎÒ×Ô¼ºµÄÆ«ºÃÊÇʹÓà Rollup ×÷Ϊ¹¹½¨¹¤¾ß£¬À´×Ô¶¯µØ½«µ¥¸ö´úÂë¿â·Ö¸îµ½²»Í¬µÄ
index.js ºÍ browser.js ÎļþÀï¡£Õâ¶ÔÓÚ½«ÄãÌṩ¸øÓû§µÄ´úÂëµÄ½âÄ£¿é»¯ÓжîÍâµÄ¼ÛÖµ£¬½ÚÊ¡Á˿ռäºÍʱ¼ä¡£
ÒªÕâÑù×öµÄ»°£¬ÏȰ²×° rollup ºÍ rollup-plugin-replace£¬È»ºó¶¨ÒåÒ»¸ö rollup.config.js
Îļþ£º
import replace from 'rollup-plugin-replace'; export default { entry: 'src/index.js', format: 'cjs', plugins: [ replace({ 'process.browser': !!process.env.BROWSER }) ] }; |
£¨ÎÒÃǽ«Ê¹Óà process.env.BROWSER ×÷ΪһÖÖ·½±ãµØÔÚä¯ÀÀÆ÷¹¹½¨ºÍ Node ¹¹½¨¼äÇл»µÄ·½Ê½¡££©
½ÓÏÂÀ´£¬ÎÒÃÇ¿ÉÒÔ´´½¨Ò»¸ö´øÓе¥¸öº¯ÊýµÄ src/index.js Îļþ£¬Ê¹ÓÃÆÕͨµÄ process.browser
Ìõ¼þ£º
export default function base64Encode(string) { if (process.browser) { return btoa(string); } else { return Buffer.from(string, 'binary').toString('base64'); } } |
È»ºó½« prepublish ²½ÖèÌí¼Óµ½ package.json ÄÚ£¬À´Éú³ÉÎļþ£º
{ /* ... */ "scripts": { "prepublish": "rollup -c > index.js && BROWSER=true rollup -c > browser.js" } } |
Éú³ÉµÄÎļþ¶¼Ï൱ֱ°×Ò×¶Á£º
// index.js 'use strict'; function base64Encode(string) { { return Buffer.from(string, 'binary').toString('base64'); } } module.exports = base64Encode; // browser.js 'use strict'; function base64Encode(string) { { return btoa(string); } } module.exports = base64Encode; |
Ä㽫עÒâµ½£¬Rollup »á°´Ðè×Ô¶¯µØ½« process.browser ת»»³É true »òÕß false£¬È»ºóÈ¥µôÄÇЩÎÞÓôúÂë¡£ËùÒÔÔÚÉú³ÉµÄä¯ÀÀÆ÷°üÀï²»»áÓжÔÓÚ
process »òÕß Buffer µÄÒýÓá£
ʹÓÃÕâ¸ö¼¼ÇÉ£¬ÔÚÄãµÄ´úÂë¿âÀï¿ÉÒÔÓÐÈÎÒâ¸öµÄ process.browser Çл»£¬²¢ÇÒ·¢²¼µÄ½á¹ûÊÇÁ½¸öСµÄ¼¯ÖеÄ
index.js ºÍ browser.js Îļþ£¬ÆäÖжÔÓÚ Node Ö»ÓÐ Node Ïà¹ØµÄ´úÂ룬¶ÔÓÚä¯ÀÀÆ÷Ö»ÓÐä¯ÀÀÆ÷Ïà¹ØµÄ´úÂë¡£
×÷Ϊ¸½´øµÄ¸£Àû£¬Äã¿ÉÒÔÅäÖà Rollup À´Éú³É ES Ä£¿é¹¹½¨£¬IIFE ¹¹½¨£¬»òÕß UMD ¹¹½¨¡£Èç¹ûÄãÏëҪʾÀýµÄ»°£¬¿ÉÒԲ鿴ÎÒµÄÏîÄ¿
marky£¬ÕâÊÇÒ»¸öÓµÓжà¸ö Rollup ¹¹½¨Ä¿±êµÄ¼òµ¥¿â¡£
ÔÚÕâÆªÎÄÕÂÀïÃèÊöµÄʵ¼ÊÏîÄ¿£¨base64-encode-string£©Ò²Í¬Ñù±» ·¢²¼µ½ npm ÉÏ £¬Äã¿ÉÒÔÉóÊÓËü£¬¿´¿´ËüÊÇÔõô×öµ½µÄ¡£Ô´Âë
ÔÚ GitHub ÉÏ¡£ |