整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          Android圖片資源檢測插件實現(xiàn)


          什么要檢測圖片資源?

          1. 避免不小心把未壓縮,不合適的圖片資源打入apk中,造成apk過大
          2. 圖片打入apk前,可以自動化轉換,壓縮

          實現(xiàn)思路

          1. 思路一:使用gradle在aapt編譯期,掃描匯總資源的文件夾,過濾出不符合要求的圖片資源,并拋出異常中斷編譯
          2. 思路二:是思路一的進階。還是在使用gradle在aapt編譯期,查找有沒有合適的gradle task,提供給我們遍歷所有資源的機會

          gradle插件實現(xiàn)

          gradle插件實現(xiàn)的基礎

          簡單對gradle插件實現(xiàn)進行復習

          插件搭建

          • 新建一個模塊
          • 配置好該模塊的上傳配置(mvn.gradle)
          • 在build中,對gradleApi進行依賴
          • scss復制代碼
          • apply plugin: 'kotlin' //插件如果使用kotlin實現(xiàn),需要依賴kotlindependencies { implementation gradleApi() implementation localGroovy() implementation 'com.android.tools.build:gradle:3.4.2'}
          • 在main下面新建resources.META-INF.gradle-plugins文件夾
          • 在該文件夾中創(chuàng)建一個和module同名的.properties文件,在里面配置上你的插件入口類
          • 例:
          • arduino復制代碼
          • implementation-class=com.xxx.checkbigimage.image.ImagePlugin

          插件的基本實現(xiàn)

          上面講到要配置一個入口類,這個入口類就是實現(xiàn)了Plugin接口的類,它有一個override fun apply(project: Project)方法,就是我們插件開始執(zhí)行的地方,相當于main函數(shù),參數(shù)project就是整個工程的配置文件

          可以使用以下方法,從我們使用插件的地方獲取到對插件的配置

          python復制代碼project.extensions.create("config", Config::class.java)mConfig = project.property("config") as Config
          

          Config是一個java bean數(shù)據(jù)類

          "config"是我們在build中的配置名稱

          這樣一個簡單gradle插件就實現(xiàn)了

          圖片資源檢測插件實現(xiàn)

          上面說了為什么要實現(xiàn)這樣一個插件和該如何實現(xiàn)一個gradle插件,那么下面就具體介紹該插件的實現(xiàn)過程

          想要的功能

          • 檢測和攔截功能
            • 檢測是否有大小超標的圖片
            • 檢測是否有寬高超標的圖片
            • 攔截非webp資源,并進行提示
          • 自動化壓縮
            • 自動壓縮png,jpg等資源
          • 白名單設置
          • 一些統(tǒng)計功能

          實現(xiàn)過程

          上面已經(jīng)說了gradle插件的實現(xiàn),那么我們就從apply方法開始說起。

          瞄準task掛鉤

          既然是要hock android打包的編譯過程,那就要尋找android打包時,合適的task

          想hock task,首先應該拿到任務task集合

          在android插件編譯生成apk的過程中,有好多task都可以生成apk,它們的名字基于Build Types 和 Product Flavor 生成。那么我們怎么拿到具體生成apk的task組呢?

          為了解決這個問題。android插件有幾個屬性,就是我們平常配置的變體(所謂的環(huán)境),androd中有三類變體

          • applicationVariants(只適用于 app plugin)
          • libraryVariants(只適用于 library plugin)
          • testVariants(app、library plugin 均適用)

          這三個對象都是實現(xiàn)了BaseVariant(BaseVariantImpl為實現(xiàn)這個接口的抽象類)接口的類的對象的集合

          屬性名

          屬性類型

          說明

          name

          String

          Variant 的名字,唯一

          description

          String

          Variant 的描述說明

          dirName

          String

          Variant 的子文件夾名,唯一。可能有不止一個子文件夾,例如 “debug/flavor1”

          baseName

          String

          Variant 輸出的基礎名字,必須唯一

          outputFile

          File

          Variant 的輸出,該屬性可讀可寫

          processManifest

          ProcessManifest

          處理 Manifest 的 task

          aidlCompile

          AidlCompile

          編譯 AIDL 文件的 task

          renderscriptCompile

          RenderscriptCompile

          編譯 Renderscript 文件的 task

          mergeResources

          MergeResources

          合并資源文件的 task

          mergeAssets

          MergeAssets

          合并 assets 的 task

          processResources

          ProcessAndroidResources

          處理并編譯資源文件的 task

          generateBuildConfig

          GenerateBuildConfig

          生成 BuildConfig 類的 task

          javaCompile

          JavaCompile

          編譯 Java 源代碼的 task

          processJavaResources

          Copy

          處理 Java 資源的 task

          assemble

          DefaultTask

          Variant 的標志性 assemble task

          因為我們的插件應該可以應用在主工程或者模塊包上的,所以當我們插件運行后,我們要檢測當前使用我們插件的模塊是主工程,還是模塊包

          kotlin復制代碼val hasAppPlugin = project.plugins.hasPlugin("com.android.application")val variants = if (hasAppPlugin) {  (project.property("android") as AppExtension).applicationVariants} else {  (project.property("android") as LibraryExtension).libraryVariants}
          

          找到想要hock的任務

          我們想hock住android插件運行的task任務,就需要一個重要的gradle回調

          erlang復制代碼project.afterEvaluate{...}
          

          afterEvaluate該方法就是整個gradle配置文件配置成功后的回調,證明此時配置已檢查完畢,所有task已經(jīng)就緒,已經(jīng)可以開始按指定順序運行task了,那么我就需要在這個回調里辦事!

          Grade 執(zhí)行順序

          執(zhí)行setting,檢測所有module,為每個模塊配置project

          加載build.properties,生成task執(zhí)行鏈表和配置

          執(zhí)行某個指定task,然后會先執(zhí)行該task所依賴的task

          配置完成后,開始遍歷variants中所有的變體

          arduino復制代碼project.afterEvaluate {  variants.all { variant ->    ...  }}
          

          我們的目標task:mergeResourcesProvider

          mergeResourcesProvider這個任務就是android插件合并所有module中資源的task,看名字就知道了。

          我們可以從變體中獲取這個task對象

          ini復制代碼val mergeResourcesTask = variant.mergeResourcesProvider.get()
          

          那么,我們自己的任務呢?

          gradle api提供給我們可以在代碼中生成task的方法

          ini復制代碼val mcPicTask = project.task("CheckBigImage${variant.name.capitalize()}")
          

          使用project.task("taskname")來生成一個我們自己需要執(zhí)行的task

          然后我們編寫這個task的邏輯,也是本插件的邏輯

          復制代碼mcPicTask.doLast {...}
          

          variant里面有各種對象,allRawAndroidResources恰好就是我們需要的。它只有3.3以上才會有。

          ini復制代碼val dir = variant.allRawAndroidResources.files
          

          這個dir對象,就是android所有文件資源的files集合

          ok。讓我們遍歷這個文件list吧!

          scss復制代碼for (channelDir: File in dir) {check(channelDir)}fun check(file: File) { if(file.isDirectory) {   check(file)} else {   process(file)}}
          

          如果遇到文件夾,這里是一個遞歸調用。

          如果遇到文件,就可以按照自己的規(guī)則處理了。

          掛鉤mergeResourcesProvider

          我們task寫好后,需要和mergeResourcesProvider掛鉤

          less復制代碼mergeResourcesTask.dependsOn(project.tasks.findByName(mcPicTask.name))
          

          使mergeResourcesTask依賴我們的mcPicTask,當mergeResourcesTask執(zhí)行前,就會先執(zhí)行我們的mcPicTask了!!

          注意:此處直接使用mergeResourcesTask系統(tǒng)task依賴我們的task,我們的task執(zhí)行順序會和mergeResourcesTask原有的依賴混雜在一起,不可控。后面講一種可控的方法

          攔截圖片的邏輯

          這個邏輯應該實現(xiàn)在上面?zhèn)未aprocess(file:File)方法中

          1. 首先我們只需要處理圖片,所以對參數(shù)file進行首輪過濾,只留下后綴名為圖片的文件
          2. kotlin復制代碼
          3. fun isImage(file: File): Boolean { return (file.name.endsWith(Const.JPG) || file.name.endsWith(Const.PNG) || file.name.endsWith(Const.JPEG) || file.name.endsWith(Const.GIF) || file.name.endsWith(Const.WEB_P) ) && !file.name.endsWith(Const.DOT_9PNG)}
          4. 需要檢查圖片的寬高的話,可以使用java的原生api
          5. arduino復制代碼
          6. val sourceImg = ImageIO.read(FileInputStream(imgFile))if (sourceImg.height > maxHeight || sourceImg.width > maxWidth) { ...
          7. 需要過濾圖片大小的話
          8. lua復制代碼
          9. if (imgFile.length() >= maxSize) { LogUtil.log(SIZE_TAG, imgFile.path, true.toString()) return true}

          壓縮圖片邏輯

          這里我們只處理普通圖片轉換為webp的壓縮。jpg,png的自壓縮原理相同,就不復述了

          想壓縮轉換webp圖片,需要用到轉換工具

          google提供的有一套命令行轉換工具:cwebp ,各個平臺都有,我們去下載一套,放在我們的主工程文件夾下就可以了

          這里需要注意的是:為了方便,如果把cwebp命令行程序放在環(huán)境變量下,那么執(zhí)行命令時,拼接命令時,直接拼接cwebp就好。

          如果使用工程目錄下的cwebp,執(zhí)行前,需要在cwebp命令前面拼接它所在的工程目錄。

          使用

          lua復制代碼project.rootDir.path
          

          可以獲取工程的根目錄

          如何執(zhí)行命令行程序呢?

          可以使用java的api

          scss復制代碼Runtime.getRuntime().exec(cmd)
          

          現(xiàn)在可以愉快的轉換圖片了

          bash復制代碼Tools.cmd("cwebp", "${imgFile.path} -o ${webpFile.path} -m 6 -quiet")
          

          轉換后,記得把原圖刪掉

          優(yōu)化點:

          有的圖片轉換后比以前還大,這里需要注意

          第一次掃描過后的無法優(yōu)化的圖片,可以存在一個text文本當中,第二次執(zhí)行時,就不要去轉換了

          系統(tǒng)兼容

          在linux系統(tǒng)上,創(chuàng)建和刪除文件都需要權限,如果沒有權限就會失敗。這時需要先判斷當前的操作系統(tǒng)是不是linux,如果是,可以執(zhí)行chmod 755 -R ${FileUtil.getRootDirPath()}添加權限

          這里可以優(yōu)化一下,在我們的mcPicTask前面再加一個task,用來添加權限,這個task只對文件夾進行遞歸添加就可以了,比一個一個文件要來的快。

          因為我們不清楚系統(tǒng)的task(mergeResourcesTask)都依賴了哪些,那么如何在依賴上再加依賴,如何插入task呢?

          gradle api提供給了我們一個方法,xxx.taskDependencies.getDependencies(xxx)可以獲取自己的依賴樹

          在這里就是

          scss復制代碼(project.tasks.findByName(chmodTask.name) asTask).dependsOn(mergeResourcesTask.taskDependencies.getDependencies(mergeResourcesTask))
          

          讓chmodTask依賴mergeResourcesTask的依賴。假如mergeResourcesTask是A,chmodTask是B。A依賴一個系統(tǒng)的C。那么上面的代碼就是讓B依賴了C。這時的task圖就是 B->C,A->C

          接下來我們再把mcPicTask(簡稱為D)也依賴進來

          arduino復制代碼(project.tasks.findByName(mcPicTask.name) as Task).dependsOn(project.tasks.findByName(chmodTask.name) as Task)
          

          這時就是D->B->C,A->C

          最后,回到我們剛剛攔截圖片的邏輯的最后代碼

          less復制代碼mergeResourcesTask.dependsOn(project.tasks.findByName(mcPicTask.name))
          

          就變成了A->D->B->C,也就是mergeResourcesTask->mcPicTask->chmodTask->原依賴task,依賴和執(zhí)行順序是相反的。

          正常的代碼就是

          scss復制代碼(project.tasks.findByName(chmodTask.name) asTask).dependsOn(mergeResourcesTask.taskDependencies.getDependencies(mergeResourcesTask))(project.tasks.findByName(mcPicTask.name) as Task).dependsOn(project.tasks.findByName(chmodTask.name) as Task)mergeResourcesTask.dependsOn(project.tasks.findByName(mcPicTask.name))
          

          Tips

          直接使用mergeResourcesTask.dependsOn(project.tasks.findByName(mcPicTask.name))插入task。執(zhí)行順序打印

          ......

          Task :app:mainApkListPersistenceDebug UP-TO-DATE

          Task :app:CheckBigImageDebug

          Task :app:generateDebugResValues UP-TO-DATE Task :app:generateDebugResources UP-TO-DATE Task :app:mergeDebugResources

          ......

          而使用正規(guī)的插入法順序

          Task :app:mainApkListPersistenceDebug UP-TO-DATE Task :app:generateDebugResValues UP-TO-DATE Task :app:generateDebugResources UP-TO-DATE Task :app:chmodDebug

          Task :app:CheckBigImageDebug

          Task :app:mergeDebugResources

          gradle版本差異

          我們上面的例子,都是基于比較最新的gradle和android gradle tools版本(>3.3),android插件直接提供給了我們allRawAndroidResources,方便無比,直接在merge前遍歷它就好了。

          那么3.3之前的版本呢?就是我們最初的設想了,在合并完各個module資源后,掃描merge文件夾!這里又有aapt和aapt2的差異

          方法一

          關掉aapt2

          ini復制代碼android.enableAapt2=false
          

          mergeDebugResources后,processDebugResources前掃描文件夾

          前面說過,mergeDebugResources是合并所有module的資源文件到固定目錄

          那么processDebugResources是什么呢?就是處理這些已經(jīng)合并完成的文件,生成R.id,資源索引之類的文件

          那么我們的任務就必須插入到processDebugResources前面,而不是mergeDebugResources

          方法二

          仔細翻了翻MergeResources里面的方法,有一個getResSet和computeResourceSetList看起來有點意思。那么computeResourceSetList中又調用了getResSet。最后發(fā)現(xiàn)computeResourceSetList果然可以獲取所有文件列表。

          less復制代碼/*** Computes the list of resource sets to be used during execution based all the inputs.*/@VisibleForTesting@NonNullList<ResourceSet> computeResourceSetList()
          

          注釋也很有意思,有道翻譯一下:根據(jù)所有輸入計算執(zhí)行期間使用的資源集列表。

          鑒于該方法是友元方法,就使用反射獲取。

          因為3.3之后,aapt2是強制開啟的,并且aapt2 merge后的文件不是原文件了哦!注意aapt1合并后,還是正常的xxx.png。aapt2合并后的文件擴展名為flat

          所以,方法一不支持大于3.3的gradle版本。方法二支持。可以平滑過渡到新版本。鑒于新版本的gradle直接提供了allRawAndroidResources這樣的方法,所以在3.3以上,直接使用它就可以了

          allRawAndroidResources和掃描合并文件夾的差異。

          allRawAndroidResources提供的是未合并前的資源路徑

          • 源碼依賴的module,編譯時,會獲取該文件的真實路徑
          • aar依賴的路徑,會獲取到aar-cache的路徑
          • 所以:如果開啟自動轉換webp功能你會發(fā)現(xiàn):你本地源代碼中的png,都轉成了webp

          掃描合并文件夾,掃描的是編譯期merge成功后的文件夾

          • 不會影響源代碼

          優(yōu)化

          1. 已經(jīng)掃描過的,且確認無法經(jīng)過webp優(yōu)化的圖片,把這些名稱寫入一個本地文件,優(yōu)化掃描速度

          未來想做的事情

          統(tǒng)計

          1. 攔截了多少圖片
          2. 轉換了多少圖片
          3. 3. 統(tǒng)計各個模塊的圖片資源情況。在合適的時間進行預警

          Vue是一個構建數(shù)據(jù)驅動的 web 界面的漸進式框架。Vue.js 的目標是通過盡可能簡單的 API 實現(xiàn)響應的數(shù)據(jù)綁定和組合的視圖組件特別整理了常用的vue插件,來了個大匯總,方便查找使用,便于工作和學習。很全的vue插件匯總,趕緊收藏下吧!

          一、UI組件及框架

          element - 餓了么出品的Vue2的web UI工具套件

          mint-ui - Vue 2的移動UI元素

          iview - 基于 Vuejs 的開源 UI 組件庫

          Keen-UI - 輕量級的基本UI組件合集

          vue-material - 通過Vue Material和Vue 2建立精美的app應用

          muse-ui - 三端樣式一致的響應式 UI 庫

          vuetify - 為移動而生的Vue JS 2組件框架

          vonic - 快速構建移動端單頁應用

          vue-blu - 幫助你輕松創(chuàng)建web應用

          vue-multiselect - Vue.js選擇框解決方案

          VueCircleMenu - 漂亮的vue圓環(huán)菜單

          vue-chat - vuejs和vuex及webpack的聊天示例

          radon-ui - 快速開發(fā)產品的Vue組件庫

          vue-waterfall - Vue.js的瀑布布局組件

          vue-carbon - 基于 vue 開發(fā)MD風格的移動端

          vue-beauty - 由vue和ant design創(chuàng)建的優(yōu)美UI組件

          bootstrap-vue - 應用于Vuejs2的Twitter的Bootstrap 4組件

          vueAdmin - 基于vuejs2和element的簡單的管理員模板

          vue-ztree - 用 vue 寫的樹層級組件

          vue-tree - vue樹視圖組件

          vue-tabs - 多tab頁輕型框架

          二、滾動scroll組件

          vue-scroller - Vonic UI的功能性組件

          vue-mugen-scroll - 無限滾動組件

          vue-infinite-loading - VueJS的無限滾動插件

          vue-virtual-scroller - 帶任意數(shù)目數(shù)據(jù)的順暢的滾動

          vue-infinite-scroll - VueJS的無限滾動指令

          vue-scrollbar - 最簡單的滾動區(qū)域組件

          vue-scroll - vue滾動

          vue-pull-to-refresh - Vue2的上拉下拉

          mint-loadmore - VueJS的雙向下拉刷新組件

          vue-smoothscroll - smoothscroll的VueJS版本

          三、slider組件

          vue-awesome-swiper - vue.js觸摸滑動組件

          vue-slick - 實現(xiàn)流暢輪播框的vue組件

          vue-swipe - VueJS觸摸滑塊

          vue-swiper - 易于使用的滑塊組件

          vue-images - 顯示一組圖片的lightbox組件

          vue-carousel-3d - VueJS的3D輪播組件

          vue-slide - vue輕量級滑動組件

          vue-slider - vue 滑動組件

          vue-m-carousel - vue 移動端輪播組件

          dd-vue-component - 訂單來了的公共組件庫

          vue-easy-slider - Vue 2.x的滑塊組件

          四、編輯器

          markcook - 好看的markdown編輯器

          eme - 優(yōu)雅的Markdown編輯器

          vue-syntax-highlight - Sublime Text語法高亮

          vue-quill-editor - 基于Quill適用于Vue2的富文本編輯器

          Vueditor - 所見即所得的編輯器

          vue-html5-editor - html5所見即所得編輯器

          vue2-editor - HTML編輯器

          vue-simplemde - VueJS的Markdown編輯器組件

          vue-quill - vue組件構建quill編輯器

          五、圖表

          vue-table - 簡化數(shù)據(jù)表格

          vue-chartjs - vue中的Chartjs的封裝

          vue-charts - 輕松渲染一個圖表

          vue-chart - 強大的高速的vue圖表解析

          vue-highcharts - HighCharts組件

          chartjs - Vue Bulma的chartjs組件

          vue-chartkick - VueJS一行代碼實現(xiàn)優(yōu)美圖表

          六、日歷

          vue-calendar - 日期選擇插件

          vue-datepicker - 日歷和日期選擇組件

          vue-datetime-picker - 日期時間選擇控件

          vue2-calendar - 支持lunar和日期事件的日期選擇器

          vue-fullcalendar - 基于vue.js的全日歷組件

          vue-datepicker - 漂亮的Vue日期選擇器組件

          datepicker - 基于flatpickr的時間選擇組件

          vue2-timepicker - 下拉時間選擇器

          vue-date-picker - VueJS日期選擇器組件

          vue-datepicker-simple - 基于vue的日期選擇器

          七、地址選擇

          vue-city - 城市選擇器

          vue-region-picker - 選擇中國的省份市和地區(qū)

          八、地圖

          vue-amap - 基于Vue 2和高德地圖的地圖組件

          vue-google-maps - 帶有雙向數(shù)據(jù)綁定Google地圖組件

          vue-baidu-map- 基于 Vue 2的百度地圖組件庫

          vue-cmap - Vue China map可視化組件

          九、播放器

          vue-video-player - VueJS視頻及直播播放器

          vue-video - Vue.js的HTML5視頻播放器

          vue-music-master - vue手機端網(wǎng)頁音樂播放器

          十、文件上傳

          vue-upload-component - Vuejs文件上傳組件

          vue-core-image-upload - 輕量級的vue上傳插件

          vue-dropzone - 用于文件上傳的Vue組件

          十一、圖片處理

          vue-lazyload-img - 移動優(yōu)化的vue圖片懶加載插件

          vue-image-crop-upload - vue圖片剪裁上傳組件

          vue-svgicon - 創(chuàng)建svg圖標組件的工具

          vue-img-loader - 圖片加載UI組件

          vue-image-clip- 基于vue的圖像剪輯組件

          vue-progressive-image - Vue的漸進圖像加載插件

          十二、提示

          vue-toast-mobile - VueJS的toast插件

          vue-msgbox - vuejs的消息框

          vue-tooltip - 帶綁定信息提示的提示工具

          vue-verify-pop - 帶氣泡提示的vue校驗插件

          十三、進度條

          vue-radial-progress - Vue.js放射性進度條組件

          vue-progressbar - vue輕量級進度條

          vue2-loading-bar - 最簡單的仿Youtube加載條視圖

          十四、開發(fā)框架匯總

          vue-admin - Vue管理面板框架

          electron-vue - Electron及VueJS快速啟動樣板

          vue-2.0-boilerplate - Vue2單頁應用樣板

          vue-webgulp - 仿VueJS Vue loader示例

          vue-bulma - 輕量級高性能MVVM Admin UI框架

          vue-spa-template - 前后端分離后的單頁應用開發(fā)

          Framework7-Vue - VueJS與Framework7結合

          vue-element-starter - vue啟動頁

          十五、實用庫匯總

          vuelidate - 簡單輕量級的基于模塊的Vue.js驗證

          qingcheng - qingcheng主題

          vuex - 專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式

          vue-axios - 將axios整合到VueJS的封裝

          vue-desktop - 創(chuàng)建管理面板網(wǎng)站的UI庫

          vue-meta - 管理app的meta信息

          avoriaz - VueJS測試實用工具庫

          vue-framework7 - 結合VueJS使用的Framework7組件

          vue-lazy-render - 用于Vue組件的延遲渲染

          vue-svg-icon - vue2的可變彩色svg圖標方案

          vue-online - reactive的在線和離線組件

          vue-password-strength-meter - 交互式密碼強度計

          vuep - 用實時編輯和預覽來渲染Vue組件

          vue-bootstrap-modal - vue的Bootstrap樣式組件

          element-admin - 支持 vuecli 的 Element UI 的后臺模板

          vue-shortkey - 應用于Vue.js的Vue-ShortKey 插件

          cleave - 基于cleave.js的Cleave組件

          vue-events - 簡化事件的VueJS插件

          http-vue-loader - 從html及js環(huán)境加載vue文件

          vue-electron - 將選擇的API封裝到Vue對象中的插件

          vue-router-transition - 頁面過渡插件

          vuemit - 處理VueJS事件

          vue-cordova - Cordova的VueJS插件

          vue-qart - 用于qartjs的Vue2指令

          vue-websocket - VueJS的Websocket插件

          vue-gesture - VueJS的手勢事件插件

          vue-local-storage - 具有類型支持的Vuejs本地儲存插件

          lazy-vue - 懶加載圖片

          vue-lazyloadImg - 圖片懶加載插件

          vue-bus - VueJS的事件總線

          vue-observe-visibility - 當元素在頁面上可見或隱藏時檢測

          vue-notifications - 非阻塞通知庫

          v-media-query - vue中添加用于配合媒體查詢的方法

          vuex-shared-mutations - 分享某種Vuex mutations

          vue-lazy-component - 懶加載組件或者元素的Vue指令

          vue-reactive-storage - vue插件的Reactive層

          vue-ts-loader - 在Vue裝載機檢查腳本

          vue-pagination-2 - 簡單通用的分頁組件

          vuex-i18n - 定位插件

          Vue.resize - 檢測HTML調整大小事件的vue指令

          vue-zoombox - 一個高級zoombox

          leo-vue-validator - 異步的表單驗證組件

          modal - Vue Bulma的modal組件

          Famous-Vue - Famous庫的vue組件

          vue-input-autosize - 基于內容自動調整文本輸入的大小

          vue-file-base64 - 將文件轉換為Base64的vue組件

          Vue-Easy-Validator - 簡單的表單驗證

          vue-truncate-filter - 截斷字符串的VueJS過濾器

          十六、服務端

          vue-ssr - 結合Express使用Vue2服務端渲染

          nuxt.js - 用于服務器渲染Vue app的最小化框架

          vue-ssr - 非常簡單的VueJS服務器端渲染模板

          vue-easy-renderer - Nodejs服務端渲染

          express-vue - 簡單的使用服務器端渲染vue.js

          十七、輔助工具

          DejaVue - Vuejs可視化及壓力測試

          vue-generate-component - 輕松生成Vue js組件的CLI工具

          vscode-VueHelper - 目前vscode最好的vue代碼提示插件

          vue-play - 展示Vue組件的最小化框架

          VuejsStarterKit - vuejs starter套件

          vue-multipage-cli - 簡單的多頁CLI

          十八、應用實例

          pagekit - 輕量級的CMS建站系統(tǒng)

          vuedo - 博客平臺

          koel - 基于網(wǎng)絡的個人音頻流媒體服務

          CMS-of-Blog - 博客內容管理器

          vue-cnode - 重寫vue版cnode社區(qū)

          vue-ghpages-blog - 依賴GitHub Pages無需本地生成的靜態(tài)博客

          swoole-vue-webim - Web版的聊天應用

          fewords - 功能極其簡單的筆記本

          jackblog-vue - 個人博客系統(tǒng)

          vue-blog - 使用Vue2.0 和Vuex的vue-blog

          vue-dashing-js - nuvo-dashing-js的fork

          rss-reader - 簡單的rss閱讀器

          十九、Demo示例

          eleme - 高仿餓了么app商家詳情

          NeteaseCloudWebApp - 高仿網(wǎng)易云音樂的webapp

          vue-zhihu-daily - 知乎日報 with Vuejs

          Vue-cnodejs - 基于vue重寫Cnodejs.org的webapp

          vue2-demo - 從零構建vue2 + vue-router + vuex 開發(fā)環(huán)境

          vue-wechat - vue.js開發(fā)微信app界面

          vue-music - Vue 音樂搜索播放

          maizuo - vue/vuex/redux仿賣座網(wǎng)

          vue-demo - vue簡易留言板

          spa-starter-kit - 單頁應用啟動套件

          zhihudaily-vue - 知乎日報web版

          douban - 模仿豆瓣前端

          vue-Meizi - vue最新實戰(zhàn)項目

          vue-demo-kugou - vuejs仿寫酷狗音樂webapp

          vue2.0-taopiaopiao - vue2.0與express構建淘票票頁面

          node-vue-server-webpack - Node.js+Vue.js+webpack快速開發(fā)框架

          VueDemo_Sell_Eleme - Vue2高仿餓了么外賣平臺

          vue-leancloud-blog - 一個前后端完全分離的單頁應用

          vue-fis3 - 流行開源工具集成demo

          mi-by-vue - VueJS仿小米官網(wǎng)

          vue-demo-maizuo - 使用Vue2全家桶仿制賣座電影

          vue2.x-douban - Vue2實現(xiàn)簡易豆瓣電影webApp

          vue-adminLte-vue-router - vue和adminLte整合應用

          vue-zhihudaily - 知乎日報 Web 版本

          Zhihu-Daily-Vue.js - Vuejs單頁網(wǎng)頁應用

          vue-axios-github - 登錄攔截登出功能

          vue2.x-Cnode - 基于vue全家桶的Cnode社區(qū)

          hello-vue-django - 使用帶有Django的vuejs的樣板項目

          websocket_chat - 基于vue和websocket的多人在線聊天室

          x-blog - 開源的個人blog項目

          vue-cnode - vue單頁應用demo

          vue-express-mongodb - 簡單的前后端分離案例

          photoShare - 基于圖片分享的社交平臺

          notepad - 本地存儲的記事本

          vue-zhihudaily-2.0 - 使用Vue2.0+vue-router+vuex創(chuàng)建的zhihudaily

          vueBlog - 前后端分離博客

          Zhihu_Daily - 基于Vue和Nodejs的Web單頁應用

          vue-ruby-china - VueJS框架搭建的rubychina平臺

          vue-koa-demo - 使用Vue2和Koa1的全棧demo

          life-app-vue - 使用vue2完成多功能集合到小webapp

          vue-trip - vue2做的出行webapp

          github-explorer - 尋找最有趣的GitHub庫

          vue-ssr-boilerplate - 精簡版的ofvue-hackernews-2

          vue-bushishiren - 不是詩人應用

          houtai - 基于vue和Element的后臺管理系統(tǒng)

          ios7-vue - 使用vue2.0 vue-router vuex模擬ios7

          Framework7-VueJS - 使用移動框架的示例

          cnode-vue - 基于vue和vue-router構建的cnodejs web網(wǎng)站SPA

          vue-cli-multipage-bootstrap - 將vue官方在線示例整合到組件中

          vue-cnode - 用 Vue 做的 CNode 官網(wǎng)

          seeMusic - 跨平臺云音樂播放器

          HyaReader - 移動友好的閱讀器

          zhihu-daily - 輕松查看知乎日報內容

          vue-cnode - 使用cNode社區(qū)提供的接口

          zhihu-daily-vue - 知乎日報

          vue-dropload - 用以測試下拉加載與簡單路由

          vue-cnode-mobile - 搭建cnode社區(qū)

          Vuejs-SalePlatform - vuejs搭建的售賣平臺demo

          vue-memo - 用 vue寫的記事本應用

          sls-vuex2-demo - vuex2商城購物車demo

          v-notes - 簡單美觀的記事本

          vue-starter - VueJs項目的簡單啟動頁

          二十、其他實用插件匯總

          vue-dragging- 使元素可以拖拽

          Vue.Draggable- 實現(xiàn)拖放和視圖模型數(shù)組同步

          vue-picture-input- 移動友好的圖片文件輸入組件

          rubik- 基于Vuejs2的開源 UI 組件庫

          VueStar- 帶星星動畫的vue點贊按鈕

          vue-tables-2- 顯示數(shù)據(jù)的bootstrap樣式網(wǎng)格

          DataVisualization- 數(shù)據(jù)可視化

          vue-drag-and-drop-list- 創(chuàng)建排序列表的Vue指令

          vuwe- 基于微信WeUI所開發(fā)的專用于Vue2的組件庫

          vue-typer- 模擬用戶輸入選擇和刪除文本的Vue組件

          vue-impression- 移動Vuejs2 UI元素

          vue-datatable- 使用Vuejs創(chuàng)建的DataTableView

          vue-instant- 輕松創(chuàng)建自動提示的自定義搜索控件

          vue-slider-component- 在vue1和vue2中使用滑塊

          vue-touch-ripple- vuejs的觸摸ripple組件

          coffeebreak- 實時編輯CSS組件工具

          vue-datasource- 創(chuàng)建VueJS動態(tài)表格

          handsontable- 網(wǎng)頁表格組件

          vue-bootstrap-table- 可排序可檢索的表格

          vue-google-signin-button- 導入谷歌登錄按鈕

          vue-float-label- VueJS浮動標簽模式

          vue-tagsinput- 基于VueJS的標簽組件

          vue-social-sharing- 社交分享組件

          vue-popup-mixin- 用于管理彈出框的遮蓋層

          cubeex- 包含一套完整的移動UI

          vue-fullcalendar- vue FullCalendar封裝

          vue-material-design- Vue MD風格組件

          vue-morris- Vuejs組件封裝Morrisjs庫

          we-vue- Vue2及weui1開發(fā)的組件

          vue-form-2- 全面的HTML表單管理的解決方案

          vue-side-nav- 響應式的側邊導航

          mint-indicator- VueJS移動加載指示器插件

          vue-ripple- 制作谷歌MD風格漣漪效果的Vue組件

          vue-touch-keyboard- VueJS虛擬鍵盤組件

          vue-parallax- 整潔的視覺效果

          vue-typewriter- vue組件類型

          vue-ios-alertview- iOS7+ 風格的alertview服務

          paco-ui-vue- PACOUI的vue組件

          vue-button- Vue按鈕組件

          原文鏈接:https://blog.csdn.net/qq_25838839/article/details/84613644

          關注我的頭條號,分享更多的技術學習文章,我自己是一名從事了多年開發(fā)的web前端老程序員,目前辭職在做自己的web前端私人定制課程,今年年初我花了一個月整理了一份最適合2019年學習的web前端學習干貨,各種框架都有整理,送給每一位前端小伙伴,想要獲取的可以關注我的頭條號并在后臺私信我:前端,即可免費獲取。

          果你對數(shù)據(jù)分析感興趣,希望學習更多的方法論,希望聽聽經(jīng)驗分享,

          歡迎移步寶藏公眾號「小火龍說數(shù)據(jù)」,無廣告、無軟文、純干貨,更多精彩原創(chuàng)文章與你分享!


          1、OneTab:一鍵合并 tabTab 過多的時候,要關閉瀏覽器的時候OneTab可以幫助你快速的保存、整理瀏覽器。


          2、掘金:最新的技術動態(tài)每次打開新的 tab 頁面就可以看到最新、最熱的技術文章。


          3、markdown here超好用的 MD 編輯器,任何地方都可以把 MD 輕松的轉換為富文本,我們可以把簡書寫好的文章(帶md語法)直接復制到微信公眾號啦。


          4、Adblock Plus:免除廣告困擾你是不是每次搜索百度前幾個都是廣告?有了它,你的搜索結果只有純凈。


          5、LastPass:密碼管理軟件LastPass,全球知名在線密碼管理工具之一,采用軍事級加密算法,支持自動填充網(wǎng)站用戶名和密碼,與朋友分享登錄信息等實用功能,且在全平臺同步免費,無需訂閱 Premium,即可在手機、網(wǎng)頁、電腦端同步你的所有 LastPass 信息。


          6、二維碼(QR碼)生成器在線的二維碼生成器。最方便的用法是把當前的頁面生成二維碼,方便手機掃碼快速訪問。


          7、下載+Chrome的下載管理在二級菜單里,進去很不方便。裝了這個插件就可以直接看和管理,很好用。


          8、Github 加速器一鍵加速 Github 訪問速度,當 Github 訪問慢的時候點擊右鍵直加速,同時支持多個加速鏡像。


          9、購物黨在線的比價工具,剁手黨們趕緊裝起來。


          10、新浪微博圖床簡單好用的新浪微博圖床,同時可以快速轉換格式,HTML和Markdown等格式,支持瀏覽和刪除歷史記錄。


          11、crxMouse Chrome Gestures對于國產瀏覽器自帶鼠標手勢的功能,真覺得很方便!有了這款插件,也足夠讓你裝B了。


          12、Imagus圖片放大鏡的功能,在瀏覽新聞和博客的時候想右鍵看一下高清圖,有了這個插件完全不用,鼠標懸浮就能看高清圖片。


          13、Save to Pocket看到感興趣的先收藏著,然后走哪兒都能看,并且它由各個平臺的版本支持,同時可以自動去廣告,只把關鍵的內容保存,這樣非常方便各個平臺閱讀。


          14、網(wǎng)頁截圖:注釋&批注網(wǎng)頁截圖,批注工具。


          15、Image Downloader Chrome想下載某個頁面的圖片,不用再去資源里面一個一個看了,直接安裝這個插件,一鍵就可以下載。


          16、Google翻譯Google翻譯是一款由谷歌公司提供的網(wǎng)頁劃詞翻譯插件,它支持動態(tài)的劃詞翻譯功能,也支持網(wǎng)頁翻譯,真是閱讀外文網(wǎng)站的好幫手啊。


          17、Lucidchart Diagrams - Desktop:在線繪制多種圖表繪制各種流程圖手頭沒有趁手的工具,直接試試這個工具哈。


          18、Vimium:Linux 系統(tǒng)的 vim 編輯器快捷鍵功能能夠在chrome中應用類vim快捷鍵進行操作,實現(xiàn)雙手從鼠標上的解放,強烈推薦!


          19、New Tab Startup Quotes:學習成功人士的格言每次打開新的 tab 都會有一個名人名言,不過是英文的,得思考一下才能理解其中的奧妙,如果你能做一個中文版就好了。


          20、Search by Image:強大的以圖搜圖發(fā)現(xiàn)了一個圖片,但是不知道他是什么,或者想搜索一些類似的,那么就用這個插件。


          21、為什么你們就是不能加個空格呢 自動把網(wǎng)頁中所有中文、英文、數(shù)字、符號之間插入一個空格。


          22、Clear Cache點擊圖標即可清除緩存、cookie等,開發(fā)必備!


          23、JSON ViewerJSONView 是一個方便查看 Json 結構的插件,展開,折疊,可以非常方便的查看接口返回數(shù)據(jù)。


          24、Postman相信開發(fā)者朋友一定知道這款插件,非常方便的調用和調試 API 接口。


          25、Octotreegithub上查看代碼的時候總是一層層進入再出來,有點麻煩,有了這個插件,你可以想瀏覽本地 IDE 一樣瀏覽 Github。


          26、Table of contents sidebarTable of contents sidebar 可以讓你在閱讀很長篇幅的文章時候清晰的看到文章輪廓。


          27、Tampermonkey俗稱‘油猴子’,方便的管理插件的插件,你試試就知道如何的優(yōu)秀。


          28、Code ColaCode Cola是一個可視化編輯在線頁面css樣式的chrome插件。


          29、WEB前端助手FE助手:包括字符串編解碼、圖片base64編碼、代碼壓縮、美化、JSON格式化、正則表達式、時間轉換工具、二維碼生成器、編碼規(guī)范檢測、頁面性能檢測、柵格檢測、JS運行效率分析等等你日常生活中不可缺少的插件。


          30、sider:ChatGPT側邊欄輕松應用ChatGPT,實現(xiàn)Chrome與ChatGPT的聯(lián)動應用,強烈推薦!


          上一篇:HTML URL編碼
          下一篇:JavaScript中輸出方法
          主站蜘蛛池模板: 亚洲香蕉久久一区二区| 日韩在线一区二区三区免费视频| 波多野结衣AV无码久久一区| 国内精品视频一区二区三区| 日本免费一区二区在线观看| 国产精品久久久久一区二区三区 | 精品日韩一区二区| 亚洲国产一区视频| 亚洲免费视频一区二区三区 | 人妻无码一区二区三区四区| 97久久精品无码一区二区天美| 精品在线一区二区| 久久99国产精一区二区三区| 日本夜爽爽一区二区三区| 一区二区三区亚洲| 狠狠综合久久AV一区二区三区 | 亚洲av无码一区二区三区乱子伦| 日韩精品无码中文字幕一区二区 | 亚洲AV无码一区二区三区性色 | 国内精品视频一区二区八戒| 国产一区二区三区不卡观| 在线观看国产一区二区三区| 日韩视频一区二区在线观看| 91一区二区三区| 免费萌白酱国产一区二区| 久久精品国产一区二区三| 亚洲中文字幕丝袜制服一区 | 亚洲区精品久久一区二区三区| 奇米精品一区二区三区在| 亚洲福利视频一区| 国产一区二区好的精华液| 色国产在线视频一区| 精品国产一区二区三区在线| 久久se精品动漫一区二区三区| 久久精品国产一区二区三区不卡| 91午夜精品亚洲一区二区三区| 国内精品一区二区三区在线观看| 久久精品国产第一区二区| 全国精品一区二区在线观看| 性色A码一区二区三区天美传媒 | 立川理惠在线播放一区|