日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

前端性能優化應該怎么做?

來源: 責編: 時間:2023-12-15 09:50:57 260觀看
導讀前言最近零零散散的對剛接手的一個新項目做了一些優化,白屏、打包相關的內容都涉及到了,寫一篇文章來記錄一下。白屏相關DNS預解析、資源預加載對于項目中有很多靜態資源涉及到的公共域名,如g.alicdn.cmon,采用DNS預連接

前言

最近零零散散的對剛接手的一個新項目做了一些優化,白屏、打包相關的內容都涉及到了,寫一篇文章來記錄一下。M9F28資訊網——每日最新資訊28at.com

白屏相關

DNS預解析、資源預加載

對于項目中有很多靜態資源涉及到的公共域名,如g.alicdn.cmon,采用DNS預連接 + 解析:M9F28資訊網——每日最新資訊28at.com

<link rel="preconnect"  crossorigin /><link rel="dns-prefetch"  />

對于項目中一些必要的JS資源,采用資源預加載,可以大幅度縮短資源加載時間:M9F28資訊網——每日最新資訊28at.com

<link rel="preload"  as="script" /><link rel="preload"  as="script" />

結果:整體白屏時間降低400~600ms。M9F28資訊網——每日最新資訊28at.com

頁面級路由懶加載

原本項目打包出來的JS文件只有一個bundle.js,涵蓋了整個項目的業務代碼,對于業務方來說來說,可能訪問最多的就是新增和詳情兩個頁面,所以對于首屏加載是不友好的,應該優化成訪問哪個頁面加載對應頁面的資源,基于Ice2.0調研,將路由中的組件都轉換為懶加載模式:M9F28資訊網——每日最新資訊28at.com

routes.tsM9F28資訊網——每日最新資訊28at.com

import { lazy, IRouterConfig } from 'ice';// ice不支持layout組件設置為懶加載import Layout from '@/layouts/BasicLayout';const Home = lazy(() => import(/* webpackChunkName: 'Home' */ '@/pages/Home'));const NotFound = lazy(() => import(/* webpackChunkName: 'NotFound' */ '@/components/NotFound'));const ManualDetect = lazy(() => import(/* webpackChunkName: 'ManualDetect' */ '@/pages/ManualDetect'));const AddMission = lazy(() => import(/* webpackChunkName: 'addMission' */ '@/pages/ReconnaissanceMission/add-mission'));const MissionDetail = lazy(  () => import(/* webpackChunkName: 'missionDetail' */ '@/pages/ReconnaissanceMission/missionDetail'),);const NewMissionDetail = lazy(  () => import(/* webpackChunkName: 'newMissionDetail' */ '@/pages/ReconnaissanceMission/newMissionDetail'),);const NoPermission = lazy(() => import(/* webpackChunkName: 'NoPermission' */ '@/pages/NoPermission'));const Board = lazy(() => import(/* webpackChunkName: 'Board' */ '@/pages/Board'));const BusinessInsight = lazy(() => import(/* webpackChunkName: 'BusinessInsight' */ '@/pages/BusinessInsight'));const ChuangDaoInsight = lazy(() => import(/* webpackChunkName: 'ChuangDaoInsight' */ '@/pages/ChuangDaoInsight'));const Report = lazy(() => import(/* webpackChunkName: 'Report' */ '@/pages/Report'));const routes: IRouterConfig[] = [  {    path: '/',    component: Layout,    children: [      {        path: '/manualDetect',        component: ManualDetect,      },      {        path: '/addMission',        component: AddMission,      },      {        path: '/MissionDetail',        component: MissionDetail,      },      {        path: '/newMissionDetail',        component: NewMissionDetail,      },      {        path: '/',        exact: true,        component: Home,      },      {        path: '/noPermission',        exact: true,        component: NoPermission,      },      {        path: '/board',        exact: true,        component: Board,      },      {        path: '/businessInsight',        exact: true,        component: BusinessInsight,      },      {        path: '/chuangDaoInsight',        exact: true,        component: ChuangDaoInsight,      },      {        path: '/report',        exact: true,        component: Report,      },      {        component: NotFound,      },    ],  },];export default routes;

看一下效果。M9F28資訊網——每日最新資訊28at.com

在改動前是這樣的:M9F28資訊網——每日最新資訊28at.com

圖片圖片M9F28資訊網——每日最新資訊28at.com

無論訪問哪個頁面,請求固定的JS文件,大小為2.3MB。M9F28資訊網——每日最新資訊28at.com

改動以后發版:M9F28資訊網——每日最新資訊28at.com

首屏刷新:M9F28資訊網——每日最新資訊28at.com

圖片圖片M9F28資訊網——每日最新資訊28at.com

切換一個路由:M9F28資訊網——每日最新資訊28at.com

圖片圖片M9F28資訊網——每日最新資訊28at.com

效果很明顯了,文件資源也小了很多,白屏時間自然就下降了。M9F28資訊網——每日最新資訊28at.com

詳細的文章在這里:M9F28資訊網——每日最新資訊28at.com

React中的懶加載以及在Ice中實踐M9F28資訊網——每日最新資訊28at.com

結果:白屏時間整體降低,請求資源大小整體下降。M9F28資訊網——每日最新資訊28at.com

構建相關

優化本地熱更新時間

項目本地熱更新時間比較慢,大約在8~9秒,基于ice運行時中間件在每次代碼變更時加入緩存同時移除對node_module目錄下的babel轉換,可以寫一段這樣的代碼:M9F28資訊網——每日最新資訊28at.com

module.exports = ({ onGetWebpackConfig }) => {  onGetWebpackConfig((config) => {    config.module      .rule('tsx')      .test(//.jsx?|/.tsx?$/)      .exclude.add(/node_modules/)      .end()      .use('babel-loader')      .tap((options) => {        return {          ...options,          cacheDirectory: true,        };      });  });};

在build.json中注入該插件:M9F28資訊網——每日最新資訊28at.com

{  // ...  "plugins": [    "@ali/build-plugin-faas",    [      "build-plugin-ignore-style",      {        "libraryName": "antd"      }    ],    "@ali/build-plugin-ice-def",    "./src/index.ts"  ]}

圖片圖片M9F28資訊網——每日最新資訊28at.com

結果:熱更新時間降低到4秒左右,降低50%。M9F28資訊網——每日最新資訊28at.com

構建包大小優化

CDN資源替代項目依賴包

利用Webpack模塊可視化工具,項目中的依賴是這樣的:M9F28資訊網——每日最新資訊28at.com

圖片圖片M9F28資訊網——每日最新資訊28at.com

圖片圖片M9F28資訊網——每日最新資訊28at.com

從上圖可以看到:在開發環境整個構建包體積達到了19.44MB,echarts、antv、moment這些包,體積都比較大,達到了MB量級,并且在項目中前兩者使用頻率很低,只有引用過一次,對于這種情況,考慮將依賴包轉換為CDN引入的方式,原因如下:M9F28資訊網——每日最新資訊28at.com

  • 減少打包產物大小;
  • 減少白屏時間;
  • 版本固定,使用頻率低,通過CDN單獨引入還會有瀏覽器強緩存的效益;

通過Webpack中externals,取消對于node_modules中枚舉包的計算,并且在項目index.html中從CDN引入所列舉到的包。M9F28資訊網——每日最新資訊28at.com

{ // ...  "externals": {    "echarts": "echarts",    "moment": "moment"  },}

externals這里的key、value值分別對應npm中的包名和CDN引入后在window下的全局變量名,找包的CDN路徑很簡單,但是如何知道全局變量名是什么呢?M9F28資訊網——每日最新資訊28at.com

可以打開CDN鏈接,格式化代碼,大概是這個樣子的:M9F28資訊網——每日最新資訊28at.com

function(e, t) {    "object" == typeof exports && "object" == typeof module ? //判斷環境是否支持commonjs模塊規范    module.exports = t(require("vue")) :    "function" == typeof define && define.amd ? //判斷環境是否支持AMD模塊規范    define("ELEMENT", ["vue"], t) :    "object" == typeof exports ? //判斷環境是否支持CMD模塊規范    exports.ELEMENT = t(require("vue")) :     e.ELEMENT = t(e.Vue)} ("undefined" != typeof self ? self: this,function(e){    //省略...});

從這個JS文件可以看到,這個全局變量是ELEMENT咯~這塊更詳細的教程可以看一下這篇文章,這位博主總結的很全:M9F28資訊網——每日最新資訊28at.com

Webpack系列』—— externals用法詳解M9F28資訊網——每日最新資訊28at.com

代碼分割

這里利用Webpack現有的能力,對使用頻繁的第三方庫和模塊進行統一抽離,這一部分可以寫在上面提到的Ice中間件里去:M9F28資訊網——每日最新資訊28at.com

module.exports = ({ onGetWebpackConfig }) => {  onGetWebpackConfig((config) => {    config.optimization.splitChunks({      cacheGroups: {        vendor: {          priority: 1,          test: /node_modules/,          chunks: 'initial',          minChunks: 1,          minSize: 0,          name: 'vendor',          filename: 'vendor.js',        },        common: {          chunks: 'initial',          name: 'common',          minSize: 100,          minChunks: 3,          filename: 'common.js',        },      },    });  });};

抽離出來的模塊如圖:M9F28資訊網——每日最新資訊28at.com

圖片圖片M9F28資訊網——每日最新資訊28at.com

結果:優化后的構建包體積為9.1MB,降低了50%以上大小。M9F28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-46361-0.html前端性能優化應該怎么做?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 詳解Linux開源項目中常用的tput命令

下一篇: 快手聯合信通院牽頭數字身份認證技術標準 助力短視頻直播行業健康發展

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 来宾市| 岗巴县| 牟定县| 兴业县| 喜德县| 安图县| 抚顺市| 双城市| 贵州省| 鱼台县| 桃江县| 舟山市| 乌兰县| 甘南县| 漾濞| 锡林郭勒盟| 宜良县| 石景山区| 博湖县| 平谷区| 银川市| 长白| 石家庄市| 扶余县| 三明市| 淄博市| 获嘉县| 宜宾县| 华容县| 田林县| 阜城县| 桑日县| 钦州市| 苍山县| 长泰县| 文化| 始兴县| 隆尧县| 双流县| 肇源县| 沂水县|