摘要:問題描述我經常需要使用一些基礎性的功能性函數比如數據去重對象合并等通常情況下選擇方向大致有個自己實現使用原生的使用提供的首先放棄自己實現這樣的方式因為工作量大即使實現了沒有經過測試不夠穩定沒有意義因為已經存在現成的別人實現的其次如果原生提供
問題描述:
我經常需要使用一些基礎性的, 功能性函數, 比如數據去重, 對象合并等. 通常情況下,選擇方向大致有3個:
自己實現 API
使用原生的 API
使用 lodash 提供的 API
首先放棄 ‘自己實現API’ 這樣的方式, 因為:
工作量大
即使實現了, 沒有經過測試, 不夠穩定
沒有意義, 因為已經存在現成的, 別人實現的.
其次,如果原生提供的 API, 功能齊全, 兼容性好, 那么當然使用原生的 API.但是實際上原生 API 存在如下的一些問題:
語義不明, 比如說刪除數組的某個元素, 通過 splice, 但是我們更希望通過 del 這個更明了的方法
功能不全, 比如說實現對象的拷貝, 通過 Object.assign(), 但是 Object.assign() 只能支持
shadow copy, deep 不支持
兼容問題, 比如一些 ES6 出現的方法, 在低版本的設備中不支持
API 不全, 也就是 API 不能覆蓋我們所有的開發需求.
有些函數不符合我們的想法, 我們希望函數不會改變參與運算的數據結構, 但是原生的一些 API 會改變.
所以最終選擇 lodash.js.
在基于 webpack 的環境中使用 lodash.我們使用的姿勢可以有如下幾種:
1.整體通過 script 引入
這種引入方式不可行,體積太大, 會引入很多自己不需要的東西
2.單個引入
*在 main.js 里面引入, 以期望所有的組件都可以使用: 不可行, 在 main.js 里面引入, 只能在 main.js 里面生效
在單個 .vue 組件里面引入
將函數掛載到 window or Vue.prototype 上面 (推薦)
創建 my-lodash.js
import {debounce} from "lodash" let _ = { debounce } window._ = _;
在 main.js 中引入此文件, 即可在全局環境中使用這些函數了.
關于引入 lodash 之后的體積變化實驗步驟:
我們先使用 vue-cli 創建一個新的, 空白的項目. 并且修改配置文件, 去掉js的壓縮.
1. 對空白項目打包:
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
觀察可以發現
引入 lodash/merge之后, 體積增加了: 71k
不管你是在 App.vue 還是在 Hello.vue 中引入, 最終都會被打包到 vendor.js 中.
繼續實驗步驟, 現在我們加上壓縮.
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
觀察可以發現: 引入 lodash/merge 之后, 體積增加了 15k.
考慮新的問題:
我們在項目中引入了 lodash/merge 函數, 然后我們使用的一個第三方的 npm lib, 它也使用了lodash/merge, 此時打包, 會有什么樣的結果?
第三方 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 大小, 也就是說我們引入的第三方 lib, 大小為 24k, 和我們看到的結果一致.
這個結果反饋出來的是:
第三方 lib 中, 引用的 lodash/merge 函數, 然后項目中自己也使用了 lodash/merge 函數。
此時, 二者之間并沒有公用.
面對這個結果, 我們能做的是什么呢?
讓 第三方 lib, 就是我自己的第三方 lib, 在打包的時候, 不會把它的依賴項目一起打包起來.
在第三方 lib 的 package.json 里面聲明它的依賴項目.
用戶在下載第三方 lib 的時候, 會一起把在 package.json 中的依賴項目一起下載.
最后我們來討論下:
我們說引入了一個 lodash/merge 函數, 項目的體積在壓縮后就增加了 15k, 那么如果多引入幾個函數呢?
引入 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"
最終項目大小增加了 29k.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/84806.html
摘要:仿滴滴出行項目最近,各大社區出現很多小伙伴的項目,趁著這股熱潮我也用擼了一個滴滴出行的項目。可是,后來在手機上發現,輸入的時候居然調不出軟鍵盤,寫項目的時候沒考慮到設備問題,簡直是大大的失誤。也就是說可以在組件內部進行請求,不需要提交。 Vue2.0 仿滴滴出行項目 最近,各大社區出現很多小伙伴的vue項目,趁著這股熱潮我也用vue擼了一個滴滴出行的項目。 效果預覽 showImg(h...
摘要:碰到這種面試官,你只有是個題霸,再加上眼緣夠才能順利入圍。只要按照我題目的思路,甚至打出來測試用例看看,就能實現這個題目了。答案根據的,對答案做出修正。另我的答案絕不敢稱最佳,隨時歡迎優化修正。但了解總歸是好的。 我們在長期的面試過程中,經歷了種種苦不堪言,不訴苦感覺不過癮(我盡量控制),然后主要聊聊常見JavaScript面試題的解法,以及面試注意事項 憶苦 面試第一苦,面試官的土 ...
摘要:其他交互一般會遵循一些數據結構協議或者狀態值,比如不同的操作結果對應不同的狀態值,且出錯會返回指定的錯誤信息方便前端進行提示等。 RESTful這種架構已經具有很長的時間和歷程了,但似乎最近restful這個詞出現的頻率特別高,目前不是很清楚是因為我自個兒現在是以restful風格寫程序產生的孕婦效應,還是單頁面程序開發的流行造成的。 其實一開始我也是不想寫這篇文章的,因為網絡上與re...
摘要:可簡單地認為它是的擴展,負載均衡自然成為不可或缺的特性。是基于開發的服務代理組件,在使用場景中,它與和整合,打造具備服務動態更新和負載均衡能力的服務網關。類似的特性在項目也有體現,它是另一種高性能代理的方案,提供服務發現健康和負載均衡。 摘要: Cloud Native 應用架構隨著云技術的發展受到業界特別重視和關注,尤其是 CNCF(Cloud Native Computing Fo...
閱讀 1482·2019-08-30 15:44
閱讀 1946·2019-08-30 14:07
閱讀 2871·2019-08-30 13:56
閱讀 2337·2019-08-29 17:06
閱讀 1324·2019-08-29 14:13
閱讀 2079·2019-08-29 11:28
閱讀 3224·2019-08-26 13:56
閱讀 1941·2019-08-26 12:11