ykfe/ssr 框架

倉庫地址

架構(gòu)設(shè)計

  1. 腳手架命令行工具: ssr
    提供了常用的命令:start build deploy

本地開發(fā)環(huán)境

  1. 執(zhí)行ssr start
// 核心執(zhí)行代碼如下
// 插件通過項目中的plugin.js文件配置
const plugin = loadPlugin()
// start client webpack dev server
await plugin.clientPlugin?.start?.(argv)
// 啟動midway
await plugin.serverPlugin?.start?.(argv)
  1. plugin.js 中聲明serverPlugin clientPlugin插件
const { midwayPlugin } = require('ssr-plugin-midway')
const { reactPlugin } = require('ssr-plugin-react')

module.exports = {
  serverPlugin: midwayPlugin(),
  clientPlugin: reactPlugin()
}
  1. ssr-plugin-react 邏輯
// 依賴webpack-chain
import * as WebpackChain from 'webpack-chain'
// 包裝了webpack的功能
import { startClientServer, startServerBuild, startClientBuild } from 'ssr-webpack'
// 獲取客戶端和服務(wù)端構(gòu)建的配置
import { getClientWebpack, getServerWebpack } from './config'

export function reactPlugin () {
  return {
    name: 'plugin-react',
    // 本地開發(fā)環(huán)境
    start: async () => {
      // 使用weback-chain 來配置webpack
      const serverConfigChain = new WebpackChain()
      // 調(diào)用的是 ssr-webpack 里面的方法
      // server端開發(fā)環(huán)境的配置  見[附錄1]
      await startServerBuild(getServerWebpack(serverConfigChain))
      const clientConfigChain = new WebpackChain()
      // 開發(fā)環(huán)境client端的配置 見[附錄2]
      await startClientServer(getClientWebpack(clientConfigChain))
    },
    build: async () => {
      const serverConfigChain = new WebpackChain()
      await startServerBuild(getServerWebpack(serverConfigChain))
      const clientConfigChain = new WebpackChain()
      await startClientBuild(getClientWebpack(clientConfigChain))
    }
  }
}
  1. ssr-webpack
import { webpackPromisify } from '../utils/promisify'
const startServerBuild = async (webpackConfig: webpack.Configuration) => {
  const { webpackStatsOption } = loadConfig()
  // 這里將webpack包裝成了一個promise對象 方便結(jié)合await使用
  const stats = await webpackPromisify(webpackConfig)
  console.log(stats.toString(webpackStatsOption))
}
  1. promisify邏輯
    比較簡單,利用了nodejs自帶的模塊 util提供的promisify 函數(shù)乙墙;
    這個函數(shù)能夠?qū)xx(arg1, (err, res)=> {}) 這種格式的函數(shù)轉(zhuǎn)換成一個promise函數(shù)
import { promisify } from 'util'
import * as webpack from 'webpack'

const webpackPromisify = promisify<webpack.Configuration, webpack.Stats>(webpack)

export {
  webpackPromisify
}

附錄:

  1. 開發(fā)環(huán)境server bundle構(gòu)建配置
{
    "mode": "development",
    "devtool": "eval-source-map",
    "target": "node",
    "watch": true,
    "output": {
        "path": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/build/server",
        "filename": "[name].server.js",
        "libraryTarget": "commonjs"
    },
    "resolve": {
        "alias": {
            "@": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/web",
            "react": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/react/index.js",
            "react-router": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/react-router/index.js",
            "react-router-dom": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/react-router-dom/index.js"
        },
        "extensions": [
            ".web.mjs",
            ".mjs",
            ".web.js",
            ".js",
            ".web.ts",
            ".ts",
            ".web.tsx",
            ".tsx",
            ".json",
            ".web.jsx",
            ".jsx",
            ".vue"
        ],
        "modules": [
            "node_modules",
            "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules",
            "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/"
        ]
    },
    "module": {
        "strictExportPresence": true,
        "rules": [
            {
                "test": {},
                "use": [
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/url-loader/dist/cjs.js",
                        "options": {
                            "limit": 10000,
                            "name": "static/[name].[hash:8].[ext]",
                            "esModule": false,
                            "fallback": {
                                "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/file-loader/dist/cjs.js",
                                "options": {
                                    "name": "static/[name].[hash:8].[ext]",
                                    "esModule": false
                                }
                            }
                        }
                    }
                ]
            },
            {
                "test": {},
                "exclude": [
                    {},
                    {}
                ],
                "use": [
                    {
                        "loader": "babel-loader",
                        "options": {
                            "cacheDirectory": true,
                            "cacheCompression": false,
                            "presets": [
                                [
                                    "@babel/preset-env",
                                    {
                                        "modules": false
                                    }
                                ],
                                [
                                    "react-app",
                                    {
                                        "flow": false,
                                        "typescript": true
                                    }
                                ]
                            ],
                            "plugins": [
                                [
                                    "import",
                                    {
                                        "libraryName": "antd",
                                        "libraryDirectory": "lib",
                                        "style": "css"
                                    }
                                ]
                            ]
                        }
                    }
                ]
            },
            {
                "test": {},
                "exclude": [
                    [
                        {},
                        {}
                    ]
                ],
                "use": [
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/css-hot-loader/index.js"
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/mini-css-extract-plugin/dist/loader.js"
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/css-loader/index.js",
                        "options": {
                            "importLoaders": 1,
                            "modules": true
                        }
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/postcss-loader/src/index.js",
                        "options": {
                            "ident": "postcss"
                        }
                    }
                ]
            },
            {
                "test": {},
                "include": [
                    [
                        {},
                        {}
                    ]
                ],
                "use": [
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/css-hot-loader/index.js"
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/mini-css-extract-plugin/dist/loader.js"
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/css-loader/index.js",
                        "options": {
                            "importLoaders": 1,
                            "modules": false
                        }
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/postcss-loader/src/index.js",
                        "options": {
                            "ident": "postcss"
                        }
                    }
                ]
            },
            {
                "test": {},
                "use": [
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/css-hot-loader/index.js"
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/mini-css-extract-plugin/dist/loader.js"
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/css-loader/index.js",
                        "options": {
                            "importLoaders": 2,
                            "modules": true
                        }
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/postcss-loader/src/index.js",
                        "options": {
                            "ident": "postcss"
                        }
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/less-loader/dist/cjs.js"
                    }
                ]
            },
            {
                "test": {},
                "use": [
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/file-loader/dist/cjs.js",
                        "options": {
                            "name": "static/[name].[hash:8].[ext]",
                            "esModule": false
                        }
                    }
                ]
            },
            {
                "test": {},
                "use": [
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/file-loader/dist/cjs.js",
                        "options": {
                            "name": "static/[name].[hash:8].[ext]",
                            "esModule": false
                        }
                    }
                ]
            }
        ]
    },
    "plugins": [
        {
            "options": {
                "filename": "static/css/[name].css",
                "ignoreOrder": false,
                "chunkFilename": "static/css/[name].chunk.css"
            }
        },
        {
            "definitions": {
                "__isBrowser__": false
            }
        }
    ],
    "entry": {
        "Page": [
            "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/ssr-plugin-react/cjs/entry/server-entry.js"
        ]
    }
}
  1. 開發(fā)環(huán)境client的webpack配置
{
    "mode": "development",
    "devtool": "cheap-module-source-map",
    "output": {
        "path": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/build/client",
        "filename": "static/js/[name].js",
        "chunkFilename": "static/js/[name].chunk.js",
        "publicPath": "/"
    },
    "resolve": {
        "alias": {
            "@": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/web",
            "react": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/react/index.js",
            "react-router": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/react-router/index.js",
            "react-router-dom": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/react-router-dom/index.js"
        },
        "extensions": [
            ".web.mjs",
            ".mjs",
            ".web.js",
            ".js",
            ".web.ts",
            ".ts",
            ".web.tsx",
            ".tsx",
            ".json",
            ".web.jsx",
            ".jsx",
            ".vue"
        ],
        "modules": [
            "node_modules",
            "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules",
            "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/"
        ]
    },
    "module": {
        "strictExportPresence": true,
        "rules": [
            {
                "test": {},
                "use": [
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/url-loader/dist/cjs.js",
                        "options": {
                            "limit": 10000,
                            "name": "static/[name].[hash:8].[ext]",
                            "esModule": false,
                            "fallback": {
                                "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/file-loader/dist/cjs.js",
                                "options": {
                                    "name": "static/[name].[hash:8].[ext]",
                                    "esModule": false
                                }
                            }
                        }
                    }
                ]
            },
            {
                "test": {},
                "exclude": [
                    {}
                ],
                "use": [
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/babel-loader/lib/index.js",
                        "options": {
                            "cacheDirectory": true,
                            "cacheCompression": false,
                            "sourceType": "unambiguous",
                            "presets": [
                                [
                                    "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/@babel/preset-env/lib/index.js",
                                    {
                                        "modules": false
                                    }
                                ],
                                [
                                    "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/babel-preset-react-app/index.js",
                                    {
                                        "flow": false,
                                        "typescript": true
                                    }
                                ]
                            ],
                            "plugins": [
                                [
                                    "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/@babel/plugin-transform-runtime/lib/index.js",
                                    {
                                        "regenerator": false,
                                        "corejs": false,
                                        "helpers": true
                                    }
                                ],
                                [
                                    "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/babel-plugin-import/lib/index.js",
                                    {
                                        "libraryName": "antd",
                                        "libraryDirectory": "es",
                                        "style": "css"
                                    }
                                ]
                            ]
                        }
                    }
                ]
            },
            {
                "test": {},
                "exclude": [
                    [
                        {},
                        {}
                    ]
                ],
                "use": [
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/css-hot-loader/index.js"
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/mini-css-extract-plugin/dist/loader.js"
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/css-loader/index.js",
                        "options": {
                            "importLoaders": 1,
                            "modules": true
                        }
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/postcss-loader/src/index.js",
                        "options": {
                            "ident": "postcss"
                        }
                    }
                ]
            },
            {
                "test": {},
                "include": [
                    [
                        {},
                        {}
                    ]
                ],
                "use": [
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/css-hot-loader/index.js"
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/mini-css-extract-plugin/dist/loader.js"
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/css-loader/index.js",
                        "options": {
                            "importLoaders": 1,
                            "modules": false
                        }
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/postcss-loader/src/index.js",
                        "options": {
                            "ident": "postcss"
                        }
                    }
                ]
            },
            {
                "test": {},
                "use": [
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/css-hot-loader/index.js"
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/mini-css-extract-plugin/dist/loader.js"
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/css-loader/index.js",
                        "options": {
                            "importLoaders": 2,
                            "modules": true
                        }
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/postcss-loader/src/index.js",
                        "options": {
                            "ident": "postcss"
                        }
                    },
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/less-loader/dist/cjs.js"
                    }
                ]
            },
            {
                "test": {},
                "use": [
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/file-loader/dist/cjs.js",
                        "options": {
                            "name": "static/[name].[hash:8].[ext]",
                            "esModule": false
                        }
                    }
                ]
            },
            {
                "test": {},
                "use": [
                    {
                        "loader": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/file-loader/dist/cjs.js",
                        "options": {
                            "name": "static/[name].[hash:8].[ext]",
                            "esModule": false
                        }
                    }
                ]
            }
        ]
    },
    "optimization": {
        "runtimeChunk": true,
        "splitChunks": {
            "chunks": "initial",
            "name": false,
            "cacheGroups": {
                "vendors": {
                    "name": "vendor"
                }
            }
        }
    },
    "plugins": [
        {
            "options": {
                "filename": "static/css/[name].css",
                "ignoreOrder": false,
                "chunkFilename": "static/css/[name].chunk.css"
            }
        },
        {
            "definitions": {
                "__isBrowser__": true
            }
        },
        {
            "appPath": "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr"
        },
        {
            "opts": {
                "publicPath": "/",
                "basePath": "",
                "fileName": "asset-manifest.json",
                "transformExtensions": {},
                "writeToFileEmit": false,
                "seed": null,
                "filter": null,
                "map": null,
                "generate": null,
                "sort": null
            }
        }
    ],
    "entry": {
        "Page": [
            "/Users/oker/projects/company/tmp/ssr/ykfe-ssr/ssr/example/midway-react-ssr/node_modules/ssr-plugin-react/cjs/entry/client-entry.js"
        ]
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壤躲,一起剝皮案震驚了整個濱河市爱葵,隨后出現(xiàn)的幾起案子箍镜,更是在濱河造成了極大的恐慌配椭,老刑警劉巖内舟,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異桩皿,居然都是意外死亡豌汇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門泄隔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拒贱,“玉大人,你說我怎么就攤上這事佛嬉÷甙模” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵暖呕,是天一觀的道長斜做。 經(jīng)常有香客問我,道長缰揪,這世上最難降的妖魔是什么陨享? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任葱淳,我火速辦了婚禮钝腺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赞厕。我一直安慰自己艳狐,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布皿桑。 她就那樣靜靜地躺著毫目,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诲侮。 梳的紋絲不亂的頭發(fā)上镀虐,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音沟绪,去河邊找鬼刮便。 笑死,一個胖子當著我的面吹牛绽慈,可吹牛的內(nèi)容都是我干的恨旱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了薯嗤?” 一聲冷哼從身側(cè)響起堵未,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎塔次,沒想到半個月后益缎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遇伞,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡掂名,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年夭咬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铆隘。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡卓舵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膀钠,到底是詐尸還是另有隱情掏湾,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布肿嘲,位于F島的核電站融击,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏雳窟。R本人自食惡果不足惜尊浪,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望封救。 院中可真熱鬧拇涤,春花似錦、人聲如沸誉结。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惩坑。三九已至掉盅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間以舒,已是汗流浹背趾痘。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蔓钟,地道東北人永票。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像奋刽,于是被迫代替她去往敵國和親瓦侮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容