在实际业务开发过程中,如果有多个项目都用同样的基础包,我们可以公共基础包单独打成独立的 Script 包,然后各项目通过 Script 引入,这样的好处就是能够提高构建速度,同时因多个项目都引用同一份静态资源,这样就能够重复利用浏览器缓存。

构建 react,react-dom 公共包

编写公共包代码

${root}/src/react-lib.js

import React from 'react';
import ReactDOM from 'react-dom';

export {
  React,
  ReactDOM
}

Webpack 构建公共包

通过 easywebpack-js 可以快速实现公共包构建打包。

${root}/webpack.config.js

module.exports = {
  framework: 'js',
  entry: {
    'react-core-lib-1.0.0': 'scr/react-lib.js'
  },
  output: {
    library: "ReactCoreLib" 
  }
}

项目 webpack.config.js 配置

${root}/webpack.config.js

  • 前端渲染非 SSR 模式只需要如下配置
module.exports = {
  externals: {
    'react': 'ReactCoreLib.React',
    'react-dom': 'ReactCoreLib.ReactDOM'
  },
}
  • SSR 模式 externals 只能在 web 模式生效
module.exports = {
  ......
  plugins:[
    {
      copy: [{ from: 'app/web/asset/lib', to: 'lib' }] // 直接 Script 方式引入 React 包
    }
  ],
  customize(webpackConfig) {
    // Node Render 时不能 externals script lib
    if (webpackConfig.target === 'web') {
      webpackConfig.externals.push({ 
        react: 'ReactCoreLib.React',
        'react-dom': 'ReactCoreLib.ReactDOM'
      });
    }
    return webpackConfig;
  }
};

项目引入 Script 链接

import React, { Component } from 'react';
import HeaderComponet from './header';
export default class Layout extends Component {
  render() {
    if(EASY_ENV_IS_NODE) {
      return <html>
        <head>
          <title>{this.props.title}</title>
          <meta charSet="utf-8"></meta>
          <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui"></meta>
          <meta name="keywords" content={this.props.keywords}></meta>
          <meta name="description" content={this.props.description}></meta>
          <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"></link>
          <script src="/public/lib/react-core-lib-1.0.0.js"></script>
        </head>
        <body><HeaderComponet></HeaderComponet><div id="app">{this.props.children}</div></body>
      </html>;
    }
    return this.props.children;
  }
}

相关 issue:https://github.com/easy-team/egg-react-webpack-boilerplate/issues/47


Author: sky
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source sky !
 Previous
服务端渲染模式 服务端渲染模式
目前 egg-view-react-ssr 支持 服务端渲染模式 和 前端渲染模式 两种渲染模式Egg + React 服务端 SSR 渲染模式这里服务端渲染指的是编写的 React 组件在 Node 服务端直接编译成完整的HTML, 然后直接输出给浏览器。MVVM 服务端渲染相比前端渲染,支...
2020-04-18 sky
Next 
SEO 实现 SEO 实现
Egg + React SSR SEO 实现MVVM 服务端渲染相比前端渲染,支持 SEO,更快的首屏渲染,相比传统的模板引擎,更好的组件化,前后端模板共用。在 Egg + React 的方案里面, HTML head 里面 meta 信息也作为 React 服务端渲染的一部分, 和普通的数据...
2020-04-18 sky