(Translated by https://www.hiragana.jp/)
GitHub - zhangyuang/egg-react-ssr: 最小而美的Egg + React + SSR 服务端渲染应用骨架,同时支持JS和TS
Skip to content

最小さいしょう而美てきEgg + React + SSR ふく务端渲染应用こつどう支持しじJSTS

License

Notifications You must be signed in to change notification settings

zhangyuang/egg-react-ssr

Repository files navigation

简体ちゅうぶん | English

Egg + React + SSR boilerplate

Build Status Coverage Status download standardjs License License Node

ちゅう: 于功のう丰富以及维护せいこう虑,再建さいけん使用しよう egg-react-ssr。现推荐使用しよう最新さいしんてき ssr かまちのう够同时支持しじざい React, Vue2/3 场景使用しよう支持しじ使用しよう Vite。わが强烈きょうれつけん议你使用しようしんてきます级版,无论渲染つくえせい还是こうのう丰富以及维护せいじょうみやこゆう极大ひさげます并经过多个大がた线上项目验证。如果你更欢开ばこそくようてきからだ验且希望きぼうじょ Serverless 能力のうりょく一键部署应用或使用 Vue2/Vue3 らい做服务端渲染。项目链接 https://github.com/zhangyuang/ssr かんかたぶんhttp://doc.ssr-fc.com/ わが们将かい续更しん维护它

最小さいしょう而美てきふく务端渲染应用ばんとくてん

  • しょう:实现方式ほうしき简洁,なま产环さかい构建出来できてき bundle 为同とう复杂てき next.js 项目的もくてき 0.7 ばいなま成文せいぶん件数けんすうりょうしょう于 next.js 减少非常ひじょうおお
  • ぜん支持しじ HMR,支持しじ本地ほんじ开发以及せい产环さかい CSR/SSR 两种渲染しき无缝きり换,支持しじじょうせい组件てき渲染しきどう支持しじ TypeScript 版本はんぽん
  • よしもとReactEggjsかまち,拥有强大きょうだいてき插件せい态,配置はいちくろ盒,方便ほうべん加入かにゅうとうぜん业务てき个性逻辑

せいざい使用しよう这个项目的もくてき公司こうし(应用)めい单,按新ぞう时间はいじょ, 如果您正ざい使用しようただしめい单中ぼつゆうれつ出来できてき话请つつみ issue,欢迎推广ぶんとおる

优酷
优酷视频
vmate 积分商城
Vmateたん视频
火炽星原CRM
炽星はらCRM
牛牛搭
うしうし
cvte
まれ沃帮じょ中心ちゅうしん
腾讯微卡
腾讯ほろ
微脉
ほろ
腾讯手游助手
腾讯しゅゆう助手じょしゅ
国家现代农业科技创新中心
国家こっか现代农业科技かぎ创新中心ちゅうしん
国盛证券
くにもり证券
极速二维码
极速维码
100教育
100教育きょういく

快速かいそくにゅう

わが使用しよう create-ssr-app らい快速かいそくてき创建项目, 支持しじ创建集成しゅうせいりょう (js|ts|antd|dva) ひとし种功のうてき应用ばん

$ npm init ssr-app my-ssr-project --template=ssr-with-js
$ cd my-ssr-project
$ npm install
$ npm start

ちゅうとう Node.js version >=15 时,应使用しよう npm init ssr-app my-ssr-project -- --template=ssr-with-js らい传递さんすう

npm scripts

1)启动ふく

启动监听 7001 はしこう,此端こうどう时用于服务端渲染以及きゃく户端渲染,つう过 query あるもの config らい指定してい渲染しき

$ npm start # たて议以ほん方式ほうしき启动应用,どう时启动服务端渲染 + きゃく户端hydrate

2)ただ启动ふく务端渲染,此时仅服务端じき html,ぼつゆうあずかきゃく户端混合こんごうてき

$ npm run ssr

3)启动きゃく户端せい态资げん编译

仅限于本开发使用しよう,启动监听 8000 はしこうたくかんぜんはしせい态资げん相当そうとう于传统的 cra あししゅ开发しき

$ npm run csr

4)はい套的脚本きゃくほん

$ npm run prod    # 使用しようegg-scripts拟SSR应用せい产环さかい,如无特殊とくしゅじょうせい要求ようきゅうせい产环さかい以用该方しき启动
$ npm run build   # つつみふく务端以及きゃく户端资源ぶんけん
$ npm run analyze # 视化分析ぶんせききゃく户端つつみてき资源详情

こうのう/特性とくせい

该模ばん特色とくしょく为:うつしほう简单、こうのう强大きょうだい一切いっさい组件、支持しじ SSR/CSR 两种渲染しき无缝きり换。

さら多功たこうのう/特性とくせい如下:

  • もと于 cra あししゅ开发,ゆかり cra 开发てき React App 无缝迁移,如果你熟悉 cra てき配置はいち上手じょうず成本なりもと几乎为 0
  • しょう而美,そう于 beidou,next.js 这样てき高度こうどふうそう方案ほうあんわが们的实现原理げんり开发しきいちもくりょうしか
  • 推荐使用しよう egg さく为 Node.js かまちただし并不强制きょうせいこと实上你可以发现几乎无需做にんなんおさむあらためそく迁移いた koa,nest.js とうかまち
  • どう支持しじ SSR 以及 CSR 两种开发しき,本地ほんじ开发环境以及线上环境みな无缝きり换两种渲しみしき
  • 统一前端路由与服务端路由,无需じゅう复编うつしよしぶんけん配置はいち
  • 支持しじきり换路よし时自动获取すうすえ
  • 支持しじ本地ほんじ开发 HMR
  • 稳定せい经过线上だい规模应用验证,提供ていきょう性能せいのう优化方案ほうあん
  • 支持しじ tree shaking,优化构建 bundle 大小だいしょう以及数量すうりょう
  • 支持しじ csr/ssr てい义 layout,无需どおり过 path らい区分くぶん
  • ほう弃传统模ばん引擎,拥抱 React 组件,使用しよう JSX らいさく为模ばん
  • はい套结あいantdてき example てき实现
  • はい套结あいreact-loadable做路よし分割ぶんかつてき example てき实现
  • はい套结あいdva做数すえ管理かんりてき example てき实现
  • はい套结あいssr-with-multipage页面应用てき example
  • はい套结あいRax版本はんぽんてき实现
  • はいTypeScript版本はんぽんてき实现

结合 Serverless

わが们在 Serverless 场景てきSSR かまちやめ经正しき发布,如果你更平滑へいかつ开箱そくようからだ验的さらだか层次かい决方あん并且希望きぼうのう够快そく部署ぶしょ。推荐使用しよう该框进行开发。与本よもと项目冲突,互相补位

うつしほう

ざいうつしほうじょう统一 csr ssr,さいよう next 类似てきせい态的 getInitialProps さく为数すえ获取方法ほうほう

function Page(props) {
  return <div> {props.name} </div>
}

Page.getInitialProps = async (ctx) => {
  return Promise.resolve({
    name: 'Egg + React + SSR',
  })
}

export default Page

具体ぐたい说明如下。

  • render React てき视图渲染方法ほうほう
  • getInitialProps 获取すうすえ方法ほうほうはたかえしかい值赋值给组件じょう
    • csr どおり过高阶组けん实现
    • ssr どおり过 Node 执行

ざい运行时,つうconfig.typeらい进行区分くぶん目前もくぜんさい简单てきどう构渲しみ方案ほうあんとう页面はつはじめ载时,getInitialProps ただかい载在ふく务端。ただゆう当路とうろよしとべ转(Link 组件とべ转或 API 方法ほうほうとべ转)时,きゃく户端ざいかい执行 getInitialProps。

getInitialProps にゅうさん对象てき属性ぞくせい如下:

  • ctx: Node 应用请求てき上下じょうげぶん(仅在 SSR 阶段以获取)
  • Router Props: 包含ほうがんよし对象属性ぞくせい包括ほうかつ pathname 以及 Router params history とう对象,详细しんいき参考さんこう react-router ぶん

一切いっさいみな组件

わが们的页面もと础模ばん html,meta とう标签みな使用しよう JSX らい生成せいせい,避免你去使用しようしげる琐的ばん引擎语法

const commonNode = (props) =>
  // 为了どう时兼ようssr/csr请保留ほりゅう判断はんだん,如果你的layoutぼつゆう内容ないよう使用しよう props.children ? { props.children } : ''
  props.children ? (
    <div className="normal">
      <h1 className="title">
        <Link to="/">Egg + React + SSR</Link>
        <div className="author">by ykfe</div>
      </h1>
      {props.children}
    </div>
  ) : (
    ''
  )

const Layout = (props) => {
  if (__isBrowser__) {
    return commonNode(props)
  } else {
    const { serverData } = props.layoutData
    const { injectCss, injectScript } = props.layoutData.app.config
    return (
      <html lang="en">
        <head>
          <meta charSet="utf-8" />
          <meta
            name="viewport"
            content="width=device-width, initial-scale=1, shrink-to-fit=no"
          />
          <meta name="theme-color" content="#000000" />
          <title>React App</title>
          {injectCss &&
            injectCss.map((item) => (
              <link rel="stylesheet" href={item} key={item} />
            ))}
        </head>
        <body>
          <div id="app">{commonNode(props)}</div>
          {serverData && (
            <script
              dangerouslySetInnerHTML={{
                __html: `window.__USE_SSR__=true; window.__INITIAL_DATA__ =${serialize(
                  serverData
                )}`,
              }}
            />
          )}
          <div
            dangerouslySetInnerHTML={{
              __html: injectScript && injectScript.join(''),
            }}
          />
        </body>
      </html>
    )
  }
}

如何いかきり换渲しみしき

ざい本地ほんじ开发时,你可以同时启动 ssr/csr 两种渲染しき查看别,ざいなま产环さかい时,你可以通过设おけ config ちゅうてき type 属性ぞくせいらいきり不同ふどうてき渲染しきあるものどおり过 query らいきり换,ざい流量りゅうりょう较大时可以降いこう级为 csr 渲染しき 参考さんこうぶん如何いかきり换渲しみしき

$ open http://localhost:7001/          # 以SSRしき渲染应用
$ open http://localhost:7001/?csr=true # きり换为CSRしき渲染あるものどおり过config.typeらい设置渲染しき

执行环境

  • ふく务器 Node.js >= 7.6, 为了原生げんせいてき使用しよう async/await 语法
  • 浏览版本はんぽんだい于等于 IE9, React 支持しじいた IE9,ただし为了さらこのみてきざい IE 使用しよう,你可能かのう需要じゅよう引入Polyfill

执行りゅうほど

运行配置はいち

为了あし够灵かつ使用しよう,这里わが们将一些关键项提供可配置的选项,すえ实际需要じゅようらい配置はいち,如无特殊とくしゅ必要ひつよう使用しようだま配置はいちそくふく务端渲染しょう配置はいちしんいきわが们放ざい config.ssr.js,ざい这里わが们建议不要ふようはた配置はいちざい egg てき配置はいちぶんけんとうちゅう,避免ぜんはし bundle ちゅう包含ほうがんきさきはし配置はいちぶんけんしんじいき

// config/config.ssr
const resolvePath = (path) => require('path').resolve(process.cwd(), path)

module.exports = {
    type: 'ssr', // 指定してい运行类型设置为csrきり换为きゃく户端渲染,此时ふく务端かい做获取すうすえ生成せいせいくしてき操作そうさ以及かい使用しようhydrate API
    static: {
        // 设置Node应用てきせい态资げん录,为了せい产环さかい读取せい态资げんぶんけん
      prefix: '/',
      dir: resolvePath('dist')
    },
    routes: [
        // ぜんきさきはし统一使用的路由配置文件,防止ぼうしじゅう复编うつししょうどうまとゆかり
      {
        path: '/', // 请求てきpath
        exact: true, // せい确匹はい
        Component: () => (require('@/page/index').default), // 这里使用しよういち个functionつつみ裹为りょう让它のべ迟require, いや则Node环境无法识别ぜんはし组件ちゅうもちいいたてきimport关键かい报错
        controller: 'page', // 需要じゅよう调用てきcontroller
        handler: 'index' // 需要じゅよう调用てきcontrollerちゅう具体ぐたいてきmethod
      },
      {
        path: '/news/:id',
        exact: true,
        Component: () => (require('@/page/news').default),
        controller: 'page',
        handler: 'index'
      }
    ],
    injectCss: [
    `/static/css/Page.chunk.css`
  ], // きゃく户端需要じゅよう载的せい态样しきひょう
  injectScript: [
    `<script src='/static/js/runtime~Page.js'></script>`,
    `<script src='/static/js/vendor.chunk.js'></script>`,
    `<script src='/static/js/Page.chunk.js'></script>`
  ], // きゃく户端需要じゅよう载的せい态资げんぶんけんひょう
  serverJs: resolvePath(`dist/Page.server.js`): string|function, // つつみきさきてきserverはしてきbundleぶんけんみち支持しじ传入CDN, 接受せつじゅ直接ちょくせつ传入requireきさきてきfunction
  layout: resolvePath(`dist/Layout.server.js`): string|function // つつみきさきてきserverはしてきbundleぶんけんみち支持しじ传入CDN, 接受せつじゅ直接ちょくせつ传入requireきさきてきfunction
}

开发配置はいち

おさむあらためだまwebpack-dev-serverてき配置はいち

// build/webpack.config.client.js

module.epxorts = {
  devServer: {
    // custom webpack-dev-server config
  }
}

录结构

录结构保持ほじりょう Egg てき方式ほうしき,以 app config 录为ぬしはたぜんはし React しょう关代码放いた web 录下,webpack つつみしょう关文けん于 build 录。整体せいたいらい录不,层级ふかぞく于刚刚好种。

├── README.md
├── app # egg核心かくしん
│   ├── controller
│   ├── extend
│   ├── middleware
│   └── router.js # eggよしぶんけん,无特殊とくしゅ需求需要じゅようおさむあらため内容ないよう
├── app.js # egg 启动入口いりくちぶんけん
├── build # webpack配置はいち
│   ├── paths.js
│   ├── util.js
│   ├── webpack.config.base.js # 通用つうようてきwebpack配置はいち
│   ├── webpack.config.client.js # webpackきゃく户端つつみ配置はいち
│   └── webpack.config.server.js # webpackふく务端つつみ配置はいち
├── config # egg 配置はいちぶんけん
│   ├── config.daily.js
│   ├── config.default.js
│   ├── config.ssr.js
│   ├── config.local.js
│   ├── config.prod.js
│   ├── plugin.js
│   └── plugin.local.js
├── dist # build生成せいせいせい态资げんぶんけん
│   ├── Page.server.js # ふく务端つつみきさきぶんけん(そくつつみきさきてきserverRender方法ほうほう)
│   └── static # ぜんはしつつみきさきせい态资げん
└── web # ぜんはしぶんけん
    ├── assets
    │   └── common.less
    ├── entry.js # webpackつつみ入口いりくちぶんけんふん环境导出不同ふどう配置はいち
    ├── layout
    │   ├── index.js # 页面ぬのきょく
    │   └── index.less
    └── page
        ├── index
        └── news

Changelog

まい一个版本的详细改动请查看 release notes

あずか其他方案ほうあんてき对比

  • あずかeasy-team方案ほうあんてき对比
  • あずかnext.js方案ほうあんてき对比

本地ほんじ如何いか调试げん

请查wiki

如何いかこうほん项目贡献だい

请查wiki

Contributors

Thanks goes to these wonderful people (emoji key):


LeonCheung

💻

おおかみ

💻

Xu Zhiyong

🐛

Menteceso

📖

jerryYu

💻

dydong

💻

snoy

📖

zhaoxingyue

📖

きゅうまき

🐛

JohannLai

🐛

robert.xu

💻

zhushijie

💻

Cheng Zhongmin

🐛

This project follows the all-contributors specification. Contributions of any kind welcome!

License

MIT

NodeParty ぶんとおる

如果你想了解りょうかいほん应用てき设计おもえ,欢迎载查本人ほんにんざい 2020.1.11 にちざい北京ぺきん NodeParty 上所かみところ做的ぶんとおるPPT,其中讨论りょう需要じゅよう关注てき一些问题的设计思路和解决方案的选取

こたえうたぐぐん

虽然わが们已经尽力じんりょく检查りょういちへん应用,ただし仍有可能かのうゆう疏漏てき地方ちほう,如果你在使用しよう过程ちゅう发现にんなん问题あるものけん议,欢迎ひさげissueあるものPR 欢迎直接ちょくせつ扫码加入かにゅう钉钉ぐん

项目 Star すうぞう长趋势

Stargazers over time