成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

前言

最近零零散散的對剛接手的一個新項目做了一些優化,白屏、打包相關的內容都涉及到了,寫一篇文章來記錄一下。

白屏相關

DNS預解析、資源預加載

對于項目中有很多靜態資源涉及到的公共域名,如g.alicdn.cmon,采用DNS預連接 + 解析:

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

對于項目中一些必要的JS資源,采用資源預加載,可以大幅度縮短資源加載時間:

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

結果:整體白屏時間降低400~600ms。

頁面級路由懶加載

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

routes.ts

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;

看一下效果。

在改動前是這樣的:

圖片圖片

無論訪問哪個頁面,請求固定的JS文件,大小為2.3MB。

改動以后發版:

首屏刷新:

圖片圖片

切換一個路由:

圖片圖片

效果很明顯了,文件資源也小了很多,白屏時間自然就下降了。

詳細的文章在這里:

React中的懶加載以及在Ice中實踐

結果:白屏時間整體降低,請求資源大小整體下降。

構建相關

優化本地熱更新時間

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

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中注入該插件:

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

圖片圖片

結果:熱更新時間降低到4秒左右,降低50%。

構建包大小優化

CDN資源替代項目依賴包

利用Webpack模塊可視化工具,項目中的依賴是這樣的:

圖片圖片

圖片圖片

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

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

通過Webpack中externals,取消對于node_modules中枚舉包的計算,并且在項目index.html中從CDN引入所列舉到的包。

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

externals這里的key、value值分別對應npm中的包名和CDN引入后在window下的全局變量名,找包的CDN路徑很簡單,但是如何知道全局變量名是什么呢?

可以打開CDN鏈接,格式化代碼,大概是這個樣子的:

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咯~這塊更詳細的教程可以看一下這篇文章,這位博主總結的很全:

Webpack系列』—— externals用法詳解

代碼分割

這里利用Webpack現有的能力,對使用頻繁的第三方庫和模塊進行統一抽離,這一部分可以寫在上面提到的Ice中間件里去:

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',
        },
      },
    });
  });
};

抽離出來的模塊如圖:

圖片圖片

結果:優化后的構建包體積為9.1MB,降低了50%以上大小。

責任編輯:武曉燕 來源: 量子前端
相關推薦

2016-09-21 10:18:26

阿里Dubbo性能測試

2022-03-10 11:25:51

InnoDB優化

2011-07-05 17:05:15

CIO

2022-11-03 17:01:10

2011-07-03 21:13:04

SEO

2011-06-24 11:17:23

SEO蜘蛛

2018-02-07 09:00:09

2015-08-07 13:30:46

2018-05-08 10:30:27

HPC混合云(IaaS

2020-03-09 16:43:06

腳本語言瀏覽器JavaScript

2022-08-23 14:51:37

網絡安全領導層存儲

2011-07-01 15:03:55

網站內部優化

2019-11-01 14:00:58

前端性能優化代碼

2020-10-16 09:00:12

前端開發技術

2022-05-17 09:02:30

前端性能優化

2020-10-16 10:40:39

前端性能可視化

2022-11-16 12:03:13

性能優化前端

2023-09-27 22:44:18

數據遷移數據庫

2021-12-16 22:43:52

運營商手機號卡數據

2025-02-12 10:03:07

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区的 | 视频一区二区在线观看 | 日韩中文在线视频 | 最新日韩在线视频 | 黄色亚洲网站 | 国产高清精品一区二区三区 | 日韩欧美在线观看 | a看片| 国产乱码一二三区精品 | 精品国产乱码久久久久久影片 | 中文字幕av一区 | 欧美日韩一 | 日韩在线视频一区二区三区 | 久久久不卡网国产精品一区 | 免费黄色在线 | 亚洲一区二区三区视频免费观看 | 欧美毛片免费观看 | 久视频在线观看 | 一区二区三区视频在线观看 | 青青草中文字幕 | 综合九九 | 国产精品成人一区二区三区夜夜夜 | 中文在线一区二区 | 国产精品久久久久久久久久三级 | 欧美国产日韩一区二区三区 | 欧美日韩在线一区二区 | 91新视频| 国产精品久久一区二区三区 | 一区二区免费在线视频 | 国产精品夜夜春夜夜爽久久电影 | 免费看a| 在线视频一区二区 | 欧美一区二区三区视频 | 日韩一区二区在线免费观看 | 日本福利在线观看 | 久久机热 | 国产精品18hdxxxⅹ在线 | 午夜影院在线观看版 | 亚洲视频在线看 | 日韩精品久久久久 | 欧美激情久久久 |