react項目優化配置的操作詳解

優化-配置CDN

通過 craco 來修改 webpack 配置,從而實現 CDN 優化

 yarn add  @craco/craco
//或者
 npm install  @craco/craco --save

在項目 根目錄新建craco.config.js文件

// 添加自定義對於webpack的配置
const path = require('path')
const { whenProd, getPlugin, pluginByName } = require('@craco/craco')
module.exports = {
  // webpack 配置
  webpack: {
    // 配置別名
    alias: {
      // 約定:使用 @ 表示 src 文件所在路徑
      '@': path.resolve(__dirname, 'src')
    },
    // 配置webpack
    // 配置CDN
    configure: (webpackConfig) => {
      // webpackConfig自動註入的webpack配置對象
      // 可以在這個函數中對它進行詳細的自定義配置
      // 隻要最後return出去就行
      let cdn = {
        js: [],
        css: []
      }
      // 隻有生產環境才配置
      whenProd(() => {
        // key:需要不參與打包的具體的包
        // value: cdn文件中 掛載於全局的變量名稱 為瞭替換之前在開發環境下
        // 通過import 導入的 react / react-dom
        webpackConfig.externals = {
          react: 'React',
          'react-dom': 'ReactDOM'
        }
        // 配置現成的cdn 資源數組 現在是公共為瞭測試
        // 實際開發的時候 用公司自己花錢買的cdn服務器
        cdn = {
          js: [
            'https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.production.min.js',
            'https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.production.min.js',
          ],
          css: []
        }
      })
      // 都是為瞭將來配置 htmlWebpackPlugin插件 將來在public/index.html註入
      // cdn資源數組時 準備好的一些現成的資源
      const { isFound, match } = getPlugin(
        webpackConfig,
        pluginByName('HtmlWebpackPlugin')
      )
      if (isFound) {
        // 找到瞭HtmlWebpackPlugin的插件
        match.userOptions.cdn = cdn
      }
      return webpackConfig
    }
  }
}

public/index.html 

<body>
  <div id="root"></div>
  <!-- 加載第三發包的 CDN 鏈接 -->
  <% htmlWebpackPlugin.userOptions.cdn.js.forEach(cdnURL => { %>
    <script src="<%=%20cdnURL%20%>"></script>
  <% }) %>
</body>

優化-路由懶加載 

使用步驟

  • 在 App 組件中,導入 Suspense 組件
  • 在 路由Router 內部,使用 Suspense 組件包裹組件內容
  • 為 Suspense 組件提供 fallback 屬性,指定 loading 占位內容
  • 導入 lazy 函數,並修改為懶加載方式導入路由組件

代碼實現

App.js

import { Routes, Route } from 'react-router-dom'
import { HistoryRouter, history } from './utils/history'
import { AuthRoute } from './components/AuthRoute'
 
// 導入必要組件
import { lazy, Suspense } from 'react'
// 按需導入路由組件
const Login = lazy(() => import('./pages/Login'))
const Layout = lazy(() => import('./pages/Layout'))
const Home = lazy(() => import('./pages/Home'))
const Article = lazy(() => import('./pages/Article'))
const Publish = lazy(() => import('./pages/Publish'))
 
function App () {
  return (
    <HistoryRouter history={history}>
      <Suspense
        fallback={
          <div
            style={{
              textAlign: 'center',
              marginTop: 200
            }}
          >
            loading...
          </div>
        }
      >
        <Routes>
          {/* 需要鑒權的路由 */}
          <Route path="/" element={
            <AuthRoute>
              <Layout />
            </AuthRoute>
          }>
            {/* 二級路由默認頁面 */}
            <Route index element={<Home />} />
            <Route path="article" element={<Article />} />
            <Route path="publish" element={<Publish />} />
          </Route>
          {/* 不需要鑒權的路由 */}
          <Route path='/login' element={<Login />} />
        </Routes>
      </Suspense>
    </HistoryRouter>
  )
}
export default App

查看效果

我們可以在打包之後,通過切換路由,監控network面板資源的請求情況,驗證是否分隔成功

到此這篇關於react項目優化配置的文章就介紹到這瞭,更多相關react項目配置內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: