摘要:?jiǎn)栴}描述我經(jīng)常需要使用一些基礎(chǔ)性的功能性函數(shù)比如數(shù)據(jù)去重對(duì)象合并等通常情況下選擇方向大致有個(gè)自己實(shí)現(xiàn)使用原生的使用提供的首先放棄自己實(shí)現(xiàn)這樣的方式因?yàn)楣ぷ髁看蠹词箤?shí)現(xiàn)了沒(méi)有經(jīng)過(guò)測(cè)試不夠穩(wěn)定沒(méi)有意義因?yàn)橐呀?jīng)存在現(xiàn)成的別人實(shí)現(xiàn)的其次如果原生提供
問(wèn)題描述:
我經(jīng)常需要使用一些基礎(chǔ)性的, 功能性函數(shù), 比如數(shù)據(jù)去重, 對(duì)象合并等. 通常情況下,選擇方向大致有3個(gè):
自己實(shí)現(xiàn) API
使用原生的 API
使用 lodash 提供的 API
首先放棄 ‘自己實(shí)現(xiàn)API’ 這樣的方式, 因?yàn)?
工作量大
即使實(shí)現(xiàn)了, 沒(méi)有經(jīng)過(guò)測(cè)試, 不夠穩(wěn)定
沒(méi)有意義, 因?yàn)橐呀?jīng)存在現(xiàn)成的, 別人實(shí)現(xiàn)的.
其次,如果原生提供的 API, 功能齊全, 兼容性好, 那么當(dāng)然使用原生的 API.但是實(shí)際上原生 API 存在如下的一些問(wèn)題:
語(yǔ)義不明, 比如說(shuō)刪除數(shù)組的某個(gè)元素, 通過(guò) splice, 但是我們更希望通過(guò) del 這個(gè)更明了的方法
功能不全, 比如說(shuō)實(shí)現(xiàn)對(duì)象的拷貝, 通過(guò) Object.assign(), 但是 Object.assign() 只能支持
shadow copy, deep 不支持
兼容問(wèn)題, 比如一些 ES6 出現(xiàn)的方法, 在低版本的設(shè)備中不支持
API 不全, 也就是 API 不能覆蓋我們所有的開發(fā)需求.
有些函數(shù)不符合我們的想法, 我們希望函數(shù)不會(huì)改變參與運(yùn)算的數(shù)據(jù)結(jié)構(gòu), 但是原生的一些 API 會(huì)改變.
所以最終選擇 lodash.js.
在基于 webpack 的環(huán)境中使用 lodash.我們使用的姿勢(shì)可以有如下幾種:
1.整體通過(guò) script 引入
這種引入方式不可行,體積太大, 會(huì)引入很多自己不需要的東西
2.單個(gè)引入
*在 main.js 里面引入, 以期望所有的組件都可以使用: 不可行, 在 main.js 里面引入, 只能在 main.js 里面生效
在單個(gè) .vue 組件里面引入
將函數(shù)掛載到 window or Vue.prototype 上面 (推薦)
創(chuàng)建 my-lodash.js
import {debounce} from "lodash" let _ = { debounce } window._ = _;
在 main.js 中引入此文件, 即可在全局環(huán)境中使用這些函數(shù)了.
關(guān)于引入 lodash 之后的體積變化實(shí)驗(yàn)步驟:
我們先使用 vue-cli 創(chuàng)建一個(gè)新的, 空白的項(xiàng)目. 并且修改配置文件, 去掉js的壓縮.
1. 對(duì)空白項(xiàng)目打包:
Asset Size Chunks Chunk Names static/js/app.js 15.4 kB 0 [emitted] app static/js/vendor.js 338 kB 1 [emitted] [big] vendor static/js/manifest.js 6.06 kB 2 [emitted] manifest
2. 在 App.vue 中引入 lodash/merge :
Asset Size Chunks Chunk Names static/js/app.js 15.6 kB 1 [emitted] app static/js/vendor.js 409 kB 0 [emitted] [big] vendor static/js/manifest.js 6.06 kB 2 [emitted] manifest
3. 在 Hello.vue 中引入 lodash/merge :
Asset Size Chunks Chunk Names static/js/app.js 15.6 kB 1 [emitted] app static/js/vendor.js 409 kB 0 [emitted] [big] vendor static/js/manifest.js 6.06 kB 2 [emitted] manifest
觀察可以發(fā)現(xiàn)
引入 lodash/merge之后, 體積增加了: 71k
不管你是在 App.vue 還是在 Hello.vue 中引入, 最終都會(huì)被打包到 vendor.js 中.
繼續(xù)實(shí)驗(yàn)步驟, 現(xiàn)在我們加上壓縮.
1. 不引入 lodash/merge
Asset Size Chunks Chunk Names static/js/app.js 11.7 kB 0 [emitted] app static/js/vendor.js 110 kB 1 [emitted] vendor static/js/manifest.js 1.49 kB 2 [emitted] manifest
2. 引入 lodash/merge:
Asset Size Chunks Chunk Names static/js/vendor.js 125 kB 0 [emitted] vendor static/js/app.js 11.8 kB 1 [emitted] app static/js/manifest.js 1.49 kB 2 [emitted] manifest
觀察可以發(fā)現(xiàn): 引入 lodash/merge 之后, 體積增加了 15k.
考慮新的問(wèn)題:
我們?cè)陧?xiàng)目中引入了 lodash/merge 函數(shù), 然后我們使用的一個(gè)第三方的 npm lib, 它也使用了lodash/merge, 此時(shí)打包, 會(huì)有什么樣的結(jié)果?
第三方 lib 的大小
Asset Size Chunks Chunk Names index.js 24.4 kB 0 [emitted] app style.css 3.75 kB 0 [emitted] app
引入第三方 lib, 打包之后的大小:
Asset Size Chunks Chunk Names static/js/vendor.js 149 kB 0 [emitted] vendor static/js/app.js 12 kB 1 [emitted] app static/js/manifest.js 1.49 kB 2 [emitted] manifest
觀察:
相比較而言, 增加了 24k 大小, 也就是說(shuō)我們引入的第三方 lib, 大小為 24k, 和我們看到的結(jié)果一致.
這個(gè)結(jié)果反饋出來(lái)的是:
第三方 lib 中, 引用的 lodash/merge 函數(shù), 然后項(xiàng)目中自己也使用了 lodash/merge 函數(shù)。
此時(shí), 二者之間并沒(méi)有公用.
面對(duì)這個(gè)結(jié)果, 我們能做的是什么呢?
讓 第三方 lib, 就是我自己的第三方 lib, 在打包的時(shí)候, 不會(huì)把它的依賴項(xiàng)目一起打包起來(lái).
在第三方 lib 的 package.json 里面聲明它的依賴項(xiàng)目.
用戶在下載第三方 lib 的時(shí)候, 會(huì)一起把在 package.json 中的依賴項(xiàng)目一起下載.
最后我們來(lái)討論下:
我們說(shuō)引入了一個(gè) lodash/merge 函數(shù), 項(xiàng)目的體積在壓縮后就增加了 15k, 那么如果多引入幾個(gè)函數(shù)呢?
引入 lodash/assign + 8k
引入 lodash/concat + 1k
引入
import _assign from "lodash/assign" import _concat from "lodash/concat" import _map from "lodash/map" import _keyBy from "lodash/keyBy" import _orderBy from "lodash/keyBy" import _sampleSize from "lodash/sampleSize" import _reject from "lodash/reject" import _isArray from "lodash/isArray" import _isBuffer from "lodash/isBuffer" import _merge from "lodash/merge"
最終項(xiàng)目大小增加了 29k.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/84806.html
摘要:仿滴滴出行項(xiàng)目最近,各大社區(qū)出現(xiàn)很多小伙伴的項(xiàng)目,趁著這股熱潮我也用擼了一個(gè)滴滴出行的項(xiàng)目??墒?,后來(lái)在手機(jī)上發(fā)現(xiàn),輸入的時(shí)候居然調(diào)不出軟鍵盤,寫項(xiàng)目的時(shí)候沒(méi)考慮到設(shè)備問(wèn)題,簡(jiǎn)直是大大的失誤。也就是說(shuō)可以在組件內(nèi)部進(jìn)行請(qǐng)求,不需要提交。 Vue2.0 仿滴滴出行項(xiàng)目 最近,各大社區(qū)出現(xiàn)很多小伙伴的vue項(xiàng)目,趁著這股熱潮我也用vue擼了一個(gè)滴滴出行的項(xiàng)目。 效果預(yù)覽 showImg(h...
摘要:碰到這種面試官,你只有是個(gè)題霸,再加上眼緣夠才能順利入圍。只要按照我題目的思路,甚至打出來(lái)測(cè)試用例看看,就能實(shí)現(xiàn)這個(gè)題目了。答案根據(jù)的,對(duì)答案做出修正。另我的答案絕不敢稱最佳,隨時(shí)歡迎優(yōu)化修正。但了解總歸是好的。 我們?cè)陂L(zhǎng)期的面試過(guò)程中,經(jīng)歷了種種苦不堪言,不訴苦感覺不過(guò)癮(我盡量控制),然后主要聊聊常見JavaScript面試題的解法,以及面試注意事項(xiàng) 憶苦 面試第一苦,面試官的土 ...
摘要:其他交互一般會(huì)遵循一些數(shù)據(jù)結(jié)構(gòu)協(xié)議或者狀態(tài)值,比如不同的操作結(jié)果對(duì)應(yīng)不同的狀態(tài)值,且出錯(cuò)會(huì)返回指定的錯(cuò)誤信息方便前端進(jìn)行提示等。 RESTful這種架構(gòu)已經(jīng)具有很長(zhǎng)的時(shí)間和歷程了,但似乎最近restful這個(gè)詞出現(xiàn)的頻率特別高,目前不是很清楚是因?yàn)槲易詡€(gè)兒現(xiàn)在是以restful風(fēng)格寫程序產(chǎn)生的孕婦效應(yīng),還是單頁(yè)面程序開發(fā)的流行造成的。 其實(shí)一開始我也是不想寫這篇文章的,因?yàn)榫W(wǎng)絡(luò)上與re...
摘要:可簡(jiǎn)單地認(rèn)為它是的擴(kuò)展,負(fù)載均衡自然成為不可或缺的特性。是基于開發(fā)的服務(wù)代理組件,在使用場(chǎng)景中,它與和整合,打造具備服務(wù)動(dòng)態(tài)更新和負(fù)載均衡能力的服務(wù)網(wǎng)關(guān)。類似的特性在項(xiàng)目也有體現(xiàn),它是另一種高性能代理的方案,提供服務(wù)發(fā)現(xiàn)健康和負(fù)載均衡。 摘要: Cloud Native 應(yīng)用架構(gòu)隨著云技術(shù)的發(fā)展受到業(yè)界特別重視和關(guān)注,尤其是 CNCF(Cloud Native Computing Fo...
閱讀 1491·2019-08-30 15:44
閱讀 1954·2019-08-30 14:07
閱讀 2881·2019-08-30 13:56
閱讀 2350·2019-08-29 17:06
閱讀 1333·2019-08-29 14:13
閱讀 2091·2019-08-29 11:28
閱讀 3238·2019-08-26 13:56
閱讀 1954·2019-08-26 12:11