From fba5ee1b0c90056d67fa035df3f941d8dc9d38cc Mon Sep 17 00:00:00 2001 From: Orange-C <741434157@qq.com> Date: Wed, 31 Jul 2019 20:54:08 +0800 Subject: [PATCH 01/45] feat: add ssr plugin --- packages/rax-plugin-ssr/package.json | 23 +++++++++++ packages/rax-plugin-ssr/src/getEntries.js | 32 +++++++++++++++ packages/rax-plugin-ssr/src/index.js | 28 +++++++++++++ packages/rax-plugin-ssr/src/runSSRDev.js | 48 ++++++++++++++++++++++ packages/rax-plugin-ssr/src/setSSRBase.js | 32 +++++++++++++++ packages/rax-plugin-ssr/src/setSSRBuild.js | 7 ++++ packages/rax-plugin-ssr/src/setWebBase.js | 48 ++++++++++++++++++++++ 7 files changed, 218 insertions(+) create mode 100644 packages/rax-plugin-ssr/package.json create mode 100644 packages/rax-plugin-ssr/src/getEntries.js create mode 100644 packages/rax-plugin-ssr/src/index.js create mode 100644 packages/rax-plugin-ssr/src/runSSRDev.js create mode 100644 packages/rax-plugin-ssr/src/setSSRBase.js create mode 100644 packages/rax-plugin-ssr/src/setSSRBuild.js create mode 100644 packages/rax-plugin-ssr/src/setWebBase.js diff --git a/packages/rax-plugin-ssr/package.json b/packages/rax-plugin-ssr/package.json new file mode 100644 index 0000000000..42fcccec3b --- /dev/null +++ b/packages/rax-plugin-ssr/package.json @@ -0,0 +1,23 @@ +{ + "name": "rax-plugin-ssr", + "version": "0.1.0-0", + "description": "rax app base plugins", + "license": "BSD-3-Clause", + "main": "src/index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/alibaba/rax.git" + }, + "bugs": { + "url": "https://github.com/alibaba/rax/issues" + }, + "homepage": "https://github.com/alibaba/rax#readme", + "dependencies": { + "address": "^1.1.0", + "chalk": "^2.4.2", + "deepmerge": "^4.0.0", + "fs-extra": "^8.1.0", + "lodash.clonedeep": "^4.5.0", + "webpack": "^4.38.0" + } +} diff --git a/packages/rax-plugin-ssr/src/getEntries.js b/packages/rax-plugin-ssr/src/getEntries.js new file mode 100644 index 0000000000..8fd615c175 --- /dev/null +++ b/packages/rax-plugin-ssr/src/getEntries.js @@ -0,0 +1,32 @@ +const path = require('path'); +const fs = require('fs-extra'); + +module.exports = (rootDir) => { + const appDirectory = rootDir; + const appSrc = path.resolve(appDirectory, 'src'); + + const entries = {}; + + const files = fs.readdirSync(path.resolve(appSrc, 'pages')); + files.map((file) => { + const absolutePath = path.resolve(appSrc, 'pages', file); + const pathStat = fs.statSync(absolutePath); + + if (pathStat.isDirectory()) { + const relativePath = path.relative(appDirectory, absolutePath); + entries[file] = './' + path.join(relativePath, '/'); + } + }); + + const documentPath = path.resolve(appSrc, 'document/index.jsx'); + if (fs.existsSync(documentPath)) { + entries._document = documentPath; + } + + const shellPath = path.resolve(appSrc, 'shell/index.jsx'); + if (fs.existsSync(shellPath)) { + entries._shell = shellPath; + } + + return entries; +}; diff --git a/packages/rax-plugin-ssr/src/index.js b/packages/rax-plugin-ssr/src/index.js new file mode 100644 index 0000000000..8e8ca9368d --- /dev/null +++ b/packages/rax-plugin-ssr/src/index.js @@ -0,0 +1,28 @@ +const clone = require('lodash.clonedeep'); + +const setSSRBase = require('./setSSRBase'); +const setSSRBuild = require('./setSSRBuild'); + +const setWebBase = require('./setWebBase'); + +const runSSRDev = require('./runSSRDev'); + +module.exports = ({ chainWebpack, registerConfig, rootDir, onHook, log }) => { + chainWebpack((config, { command }) => { + const webConfig = config.get('web'); + const ssrConfig = clone(config.get('web')); + + registerConfig('ssr', ssrConfig); + + setSSRBase(ssrConfig, rootDir); + setWebBase(webConfig, rootDir); + + if (command === 'build') { + setSSRBuild(ssrConfig); + } + + onHook('after.dev', () => { + runSSRDev(ssrConfig, log); + }); + }); +}; diff --git a/packages/rax-plugin-ssr/src/runSSRDev.js b/packages/rax-plugin-ssr/src/runSSRDev.js new file mode 100644 index 0000000000..ef7afcc1fd --- /dev/null +++ b/packages/rax-plugin-ssr/src/runSSRDev.js @@ -0,0 +1,48 @@ +const chalk = require('chalk'); +const address = require('address'); +const deepmerge = require('deepmerge'); +const webpack = require('webpack'); +const SSRDevServer = require('rax-ssr-dev-server'); + +module.exports = (config, log) => { + const webpackConfig = config.toConfig(); + let devServerConfig = { + port: 9999, + host: address.ip(), + }; + + if (webpackConfig.devServer) { + devServerConfig = deepmerge(devServerConfig, webpackConfig.devServer); + } + + let compiler; + try { + compiler = webpack(webpackConfig); + } catch (err) { + log.error(chalk.red('Failed to load webpack config.')); + log.error(err.message || err); + process.exit(1); + } + + const devServer = new SSRDevServer(compiler, devServerConfig); + + devServer.listen(devServerConfig.port, devServerConfig.host, (err) => { + if (err) { + console.log(chalk.red('[ERR]: Failed to start webpack dev server')); + console.error(err.message || err); + process.exit(1); + } + + const serverUrl = `http://${devServerConfig.host}:${devServerConfig.port}`; + + console.log(chalk.green('[Web] Starting the development server at:')); + console.log(' ', chalk.underline.white(serverUrl)); + + ['SIGINT', 'SIGTERM'].forEach(function(sig) { + process.on(sig, function() { + devServer.close(); + process.exit(); + }); + }); + }); +}; diff --git a/packages/rax-plugin-ssr/src/setSSRBase.js b/packages/rax-plugin-ssr/src/setSSRBase.js new file mode 100644 index 0000000000..c613404b3d --- /dev/null +++ b/packages/rax-plugin-ssr/src/setSSRBase.js @@ -0,0 +1,32 @@ +'use strict'; + +const { getEntries } = require('./getEntries'); + +module.exports = (config, rootDir) => { + const entries = getEntries(rootDir); + + Object.keys(entries).forEach((key) => { + config.entry(key) + .add(entries[key]); + }); + + config.resolve.alias + .clear() + .set('@core/app', 'universal-app-runtime') + .set('@core/page', 'universal-app-runtime') + .set('@core/router', 'universal-app-runtime'); + + config.target('node'); + + config.output + .filename('server/[name].js') + .libraryTarget('commonjs2'); + + config.externals({ + rax: 'rax', + }); + + config.plugin('document').clear(); + + return config; +}; diff --git a/packages/rax-plugin-ssr/src/setSSRBuild.js b/packages/rax-plugin-ssr/src/setSSRBuild.js new file mode 100644 index 0000000000..01b2b042d4 --- /dev/null +++ b/packages/rax-plugin-ssr/src/setSSRBuild.js @@ -0,0 +1,7 @@ +'use strict'; + +module.exports = (config) => { + config.optimization + .clear() + .minimize(false); +}; diff --git a/packages/rax-plugin-ssr/src/setWebBase.js b/packages/rax-plugin-ssr/src/setWebBase.js new file mode 100644 index 0000000000..0437fc512c --- /dev/null +++ b/packages/rax-plugin-ssr/src/setWebBase.js @@ -0,0 +1,48 @@ +'use strict'; + +const path = require('path'); +const AssetsManifestPlugin = require('rax-pwa-webpack-plugin/lib/AssetsManifestPlugin').default; +const { RaxPWAPlugin } = require('rax-pwa-webpack-plugin'); + +const { getEntries } = require('./getEntries'); + +module.exports = (config, rootDir) => { + const entries = getEntries(rootDir); + + config.entry.clear(); + + Object.keys(entries).forEach((key) => { + config.entry(key) + .add(entries[key]); + }); + + config.plugin('raxpwa') + .use(RaxPWAPlugin, [{ + pathConfig: { + appDirectory: rootDir, + appSrc: path.resolve(rootDir, 'src'), + appShell: path.resolve(rootDir, 'src/shell/index.js'), + appDocument: path.resolve(rootDir, 'src/document/index.js'), + appHtml: path.resolve(rootDir, 'public/index.html'), + }, + appConfig: { + title: 'test_title', + pages: { + home: { + path: '/home', + title: 'homePage', + } + }, + spa: true, + ssr: true + } + }]); + + config.plugin('assetsManifest') + .use(AssetsManifestPlugin, [{ + dist: path.resolve(rootDir, '.temp/assets_manifest.json'), + publicPath: path.resolve(rootDir, 'public') + }]); + + return config; +}; From 9277be0cbb40b45bb2ef3b63e3f70b52e861b674 Mon Sep 17 00:00:00 2001 From: Orange-C <741434157@qq.com> Date: Thu, 1 Aug 2019 09:44:41 +0800 Subject: [PATCH 02/45] fix: fix document --- packages/rax-plugin-ssr/package.json | 3 +++ packages/rax-plugin-ssr/src/index.js | 10 ++++++---- packages/rax-plugin-ssr/src/setSSRBase.js | 6 ++++-- packages/rax-plugin-ssr/src/setWebBase.js | 4 ++-- packages/raxappTest/build.json | 3 ++- packages/raxappTest/link.sh | 3 +++ 6 files changed, 20 insertions(+), 9 deletions(-) diff --git a/packages/rax-plugin-ssr/package.json b/packages/rax-plugin-ssr/package.json index 42fcccec3b..214a6bb826 100644 --- a/packages/rax-plugin-ssr/package.json +++ b/packages/rax-plugin-ssr/package.json @@ -17,7 +17,10 @@ "chalk": "^2.4.2", "deepmerge": "^4.0.0", "fs-extra": "^8.1.0", + "lodash.clone": "^4.5.0", "lodash.clonedeep": "^4.5.0", + "rax-pwa-webpack-plugin": "^1.0.0-0", + "rax-ssr-dev-server": "^1.0.0", "webpack": "^4.38.0" } } diff --git a/packages/rax-plugin-ssr/src/index.js b/packages/rax-plugin-ssr/src/index.js index 8e8ca9368d..9da59b3352 100644 --- a/packages/rax-plugin-ssr/src/index.js +++ b/packages/rax-plugin-ssr/src/index.js @@ -1,4 +1,5 @@ -const clone = require('lodash.clonedeep'); +// const clone = require('lodash.clonedeep'); +const clone = require('lodash.clone'); const setSSRBase = require('./setSSRBase'); const setSSRBuild = require('./setSSRBuild'); @@ -10,12 +11,13 @@ const runSSRDev = require('./runSSRDev'); module.exports = ({ chainWebpack, registerConfig, rootDir, onHook, log }) => { chainWebpack((config, { command }) => { const webConfig = config.get('web'); - const ssrConfig = clone(config.get('web')); + // const ssrConfig = clone(config.get('web')); + const ssrConfig = webConfig; - registerConfig('ssr', ssrConfig); + // registerConfig('ssr', ssrConfig); setSSRBase(ssrConfig, rootDir); - setWebBase(webConfig, rootDir); + // setWebBase(webConfig, rootDir); if (command === 'build') { setSSRBuild(ssrConfig); diff --git a/packages/rax-plugin-ssr/src/setSSRBase.js b/packages/rax-plugin-ssr/src/setSSRBase.js index c613404b3d..1639e1e282 100644 --- a/packages/rax-plugin-ssr/src/setSSRBase.js +++ b/packages/rax-plugin-ssr/src/setSSRBase.js @@ -1,10 +1,12 @@ 'use strict'; -const { getEntries } = require('./getEntries'); +const getEntries = require('./getEntries'); module.exports = (config, rootDir) => { const entries = getEntries(rootDir); + config.entryPoints.clear(); + Object.keys(entries).forEach((key) => { config.entry(key) .add(entries[key]); @@ -26,7 +28,7 @@ module.exports = (config, rootDir) => { rax: 'rax', }); - config.plugin('document').clear(); + config.plugins.delete('document'); return config; }; diff --git a/packages/rax-plugin-ssr/src/setWebBase.js b/packages/rax-plugin-ssr/src/setWebBase.js index 0437fc512c..70ff8e235b 100644 --- a/packages/rax-plugin-ssr/src/setWebBase.js +++ b/packages/rax-plugin-ssr/src/setWebBase.js @@ -4,12 +4,12 @@ const path = require('path'); const AssetsManifestPlugin = require('rax-pwa-webpack-plugin/lib/AssetsManifestPlugin').default; const { RaxPWAPlugin } = require('rax-pwa-webpack-plugin'); -const { getEntries } = require('./getEntries'); +const getEntries = require('./getEntries'); module.exports = (config, rootDir) => { const entries = getEntries(rootDir); - config.entry.clear(); + config.entryPoints.clear(); Object.keys(entries).forEach((key) => { config.entry(key) diff --git a/packages/raxappTest/build.json b/packages/raxappTest/build.json index 3cae1b1fb3..e3e757b8df 100644 --- a/packages/raxappTest/build.json +++ b/packages/raxappTest/build.json @@ -1,5 +1,6 @@ { "plugins": [ - ["rax-plugin-app", { "targets": ["web"]}] + ["rax-plugin-app", { "targets": ["web"]}], + "rax-plugin-ssr" ] } diff --git a/packages/raxappTest/link.sh b/packages/raxappTest/link.sh index 78f0273ba2..911c4f0b12 100755 --- a/packages/raxappTest/link.sh +++ b/packages/raxappTest/link.sh @@ -2,6 +2,9 @@ cd ../rax-plugin-app npm link ../raxappTest/node_modules/rax npm link ../universal-app-shell-loader +cd ../rax-plugin-ssr +npm link ../raxappTest/node_modules/rax + cd ../universal-app-runtime npm link ../raxappTest/node_modules/rax From 57eb5aebc3e37e305ec8d84b970103eeb729cf01 Mon Sep 17 00:00:00 2001 From: Orange-C <741434157@qq.com> Date: Thu, 1 Aug 2019 11:54:39 +0800 Subject: [PATCH 03/45] fix: fix ssr dev --- .gitignore | 1 + .../rax-plugin-app/src/config/web/setDev.js | 1 + packages/rax-plugin-app/src/index.js | 8 +++++- packages/rax-plugin-ssr/package.json | 4 +-- packages/rax-plugin-ssr/src/getEntries.js | 4 +-- packages/rax-plugin-ssr/src/index.js | 26 +++++++++---------- packages/rax-plugin-ssr/src/setSSRBuild.js | 7 ----- packages/rax-plugin-ssr/src/setWebBase.js | 9 ------- .../src/{setSSRBase.js => ssr/getBase.js} | 14 +++------- .../src/{runSSRDev.js => ssr/runDev.js} | 26 +++++++++++++++++-- packages/rax-plugin-ssr/src/ssr/setBuild.js | 22 ++++++++++++++++ packages/rax-plugin-ssr/src/ssr/setDev.js | 18 +++++++++++++ packages/rax-scripts/package.json | 2 +- packages/raxappTest/link.sh | 1 + 14 files changed, 95 insertions(+), 48 deletions(-) delete mode 100644 packages/rax-plugin-ssr/src/setSSRBuild.js rename packages/rax-plugin-ssr/src/{setSSRBase.js => ssr/getBase.js} (62%) rename packages/rax-plugin-ssr/src/{runSSRDev.js => ssr/runDev.js} (67%) create mode 100644 packages/rax-plugin-ssr/src/ssr/setBuild.js create mode 100644 packages/rax-plugin-ssr/src/ssr/setDev.js diff --git a/.gitignore b/.gitignore index 0eeb2632f2..a8b20f0400 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ coverage/ node_modules/ examples/test .idea/ +.temp/ diff --git a/packages/rax-plugin-app/src/config/web/setDev.js b/packages/rax-plugin-app/src/config/web/setDev.js index af71d585b8..c54121ba84 100644 --- a/packages/rax-plugin-app/src/config/web/setDev.js +++ b/packages/rax-plugin-app/src/config/web/setDev.js @@ -25,6 +25,7 @@ module.exports = (config, rootDir) => { .contentBase(appPublic) .watchContentBase(true) .hot(true) + .quiet(true) .publicPath(publicPath) .overlay(false) .host(address.ip()) diff --git a/packages/rax-plugin-app/src/index.js b/packages/rax-plugin-app/src/index.js index 401c6ed612..e64be7a33f 100644 --- a/packages/rax-plugin-app/src/index.js +++ b/packages/rax-plugin-app/src/index.js @@ -1,4 +1,4 @@ -module.exports = ({ chainWebpack, registerConfig, rootDir }, options = {}) => { +const pluginApp = ({ chainWebpack, registerConfig, rootDir }, options = {}) => { const { targets = [] } = options; targets.forEach(target => { @@ -19,3 +19,9 @@ module.exports = ({ chainWebpack, registerConfig, rootDir }, options = {}) => { }); }); }; + +pluginApp.getWebBase = require('./config/web/getBase'); +pluginApp.setWebDev = require('./config/web/setDev'); +pluginApp.setWebBuild = require('./config/web/setBuild'); + +module.exports = pluginApp; diff --git a/packages/rax-plugin-ssr/package.json b/packages/rax-plugin-ssr/package.json index 214a6bb826..3719e01e79 100644 --- a/packages/rax-plugin-ssr/package.json +++ b/packages/rax-plugin-ssr/package.json @@ -17,8 +17,8 @@ "chalk": "^2.4.2", "deepmerge": "^4.0.0", "fs-extra": "^8.1.0", - "lodash.clone": "^4.5.0", - "lodash.clonedeep": "^4.5.0", + "lodash": "^4.17.15", + "rax-plugin-app": "^0.1.0-0", "rax-pwa-webpack-plugin": "^1.0.0-0", "rax-ssr-dev-server": "^1.0.0", "webpack": "^4.38.0" diff --git a/packages/rax-plugin-ssr/src/getEntries.js b/packages/rax-plugin-ssr/src/getEntries.js index 8fd615c175..6f4b7fa3f6 100644 --- a/packages/rax-plugin-ssr/src/getEntries.js +++ b/packages/rax-plugin-ssr/src/getEntries.js @@ -1,7 +1,7 @@ const path = require('path'); const fs = require('fs-extra'); -module.exports = (rootDir) => { +module.exports = (rootDir, isWeb) => { const appDirectory = rootDir; const appSrc = path.resolve(appDirectory, 'src'); @@ -19,7 +19,7 @@ module.exports = (rootDir) => { }); const documentPath = path.resolve(appSrc, 'document/index.jsx'); - if (fs.existsSync(documentPath)) { + if (fs.existsSync(documentPath) && !isWeb) { entries._document = documentPath; } diff --git a/packages/rax-plugin-ssr/src/index.js b/packages/rax-plugin-ssr/src/index.js index 9da59b3352..97e22557a1 100644 --- a/packages/rax-plugin-ssr/src/index.js +++ b/packages/rax-plugin-ssr/src/index.js @@ -1,30 +1,28 @@ -// const clone = require('lodash.clonedeep'); -const clone = require('lodash.clone'); +const cloneDeep = require('lodash/cloneDeep'); -const setSSRBase = require('./setSSRBase'); -const setSSRBuild = require('./setSSRBuild'); +const getSSRBase = require('./ssr/getBase'); +const setSSRBuild = require('./ssr/setBuild'); +const setSSRDev = require('./ssr/setDev'); +const runSSRDev = require('./ssr/runDev'); const setWebBase = require('./setWebBase'); -const runSSRDev = require('./runSSRDev'); - +// can‘t clone webpack chain object module.exports = ({ chainWebpack, registerConfig, rootDir, onHook, log }) => { chainWebpack((config, { command }) => { const webConfig = config.get('web'); - // const ssrConfig = clone(config.get('web')); - const ssrConfig = webConfig; - - // registerConfig('ssr', ssrConfig); - setSSRBase(ssrConfig, rootDir); - // setWebBase(webConfig, rootDir); + setWebBase(webConfig, rootDir); if (command === 'build') { - setSSRBuild(ssrConfig); + registerConfig('ssr', getSSRBase(rootDir)); + setSSRBuild(config.get('ssr'), rootDir); } onHook('after.dev', () => { - runSSRDev(ssrConfig, log); + const devConfig = getSSRBase(rootDir); + setSSRDev(devConfig, rootDir); + runSSRDev(devConfig, rootDir, log); }); }); }; diff --git a/packages/rax-plugin-ssr/src/setSSRBuild.js b/packages/rax-plugin-ssr/src/setSSRBuild.js deleted file mode 100644 index 01b2b042d4..0000000000 --- a/packages/rax-plugin-ssr/src/setSSRBuild.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -module.exports = (config) => { - config.optimization - .clear() - .minimize(false); -}; diff --git a/packages/rax-plugin-ssr/src/setWebBase.js b/packages/rax-plugin-ssr/src/setWebBase.js index 70ff8e235b..bb3c37e7a2 100644 --- a/packages/rax-plugin-ssr/src/setWebBase.js +++ b/packages/rax-plugin-ssr/src/setWebBase.js @@ -7,15 +7,6 @@ const { RaxPWAPlugin } = require('rax-pwa-webpack-plugin'); const getEntries = require('./getEntries'); module.exports = (config, rootDir) => { - const entries = getEntries(rootDir); - - config.entryPoints.clear(); - - Object.keys(entries).forEach((key) => { - config.entry(key) - .add(entries[key]); - }); - config.plugin('raxpwa') .use(RaxPWAPlugin, [{ pathConfig: { diff --git a/packages/rax-plugin-ssr/src/setSSRBase.js b/packages/rax-plugin-ssr/src/ssr/getBase.js similarity index 62% rename from packages/rax-plugin-ssr/src/setSSRBase.js rename to packages/rax-plugin-ssr/src/ssr/getBase.js index 1639e1e282..6e42ae48d5 100644 --- a/packages/rax-plugin-ssr/src/setSSRBase.js +++ b/packages/rax-plugin-ssr/src/ssr/getBase.js @@ -1,16 +1,10 @@ 'use strict'; -const getEntries = require('./getEntries'); +const { getWebBase } = require('rax-plugin-app'); -module.exports = (config, rootDir) => { - const entries = getEntries(rootDir); - - config.entryPoints.clear(); - - Object.keys(entries).forEach((key) => { - config.entry(key) - .add(entries[key]); - }); +// Can‘t clone webpack chain object, so generate a new chain and reset config +module.exports = (rootDir) => { + const config = getWebBase(rootDir); config.resolve.alias .clear() diff --git a/packages/rax-plugin-ssr/src/runSSRDev.js b/packages/rax-plugin-ssr/src/ssr/runDev.js similarity index 67% rename from packages/rax-plugin-ssr/src/runSSRDev.js rename to packages/rax-plugin-ssr/src/ssr/runDev.js index ef7afcc1fd..a001c2c44d 100644 --- a/packages/rax-plugin-ssr/src/runSSRDev.js +++ b/packages/rax-plugin-ssr/src/ssr/runDev.js @@ -1,14 +1,36 @@ const chalk = require('chalk'); const address = require('address'); +const path = require('path'); const deepmerge = require('deepmerge'); const webpack = require('webpack'); const SSRDevServer = require('rax-ssr-dev-server'); -module.exports = (config, log) => { +const getEntries = require('../getEntries'); + +module.exports = (config, rootDir, log) => { + const entries = getEntries(rootDir); + const pagesManifest = {}; + Object.keys(entries).forEach(entry => { + pagesManifest[entry] = path.resolve(rootDir, `build/server/${entry}.js`); + }); + const webpackConfig = config.toConfig(); let devServerConfig = { - port: 9999, + port: 10100, host: address.ip(), + appConfig: { + title: 'test_title', + pages: { + home: { + path: '/home', + title: 'homePage', + } + }, + spa: true, + ssr: true + }, + pagesManifest, + assetsManifestPath: path.resolve(rootDir, '.temp/assets_manifest.json') }; if (webpackConfig.devServer) { diff --git a/packages/rax-plugin-ssr/src/ssr/setBuild.js b/packages/rax-plugin-ssr/src/ssr/setBuild.js new file mode 100644 index 0000000000..b19d27ab96 --- /dev/null +++ b/packages/rax-plugin-ssr/src/ssr/setBuild.js @@ -0,0 +1,22 @@ +'use strict'; + +const { setWebBuild } = require('rax-plugin-app'); + +const getEntries = require('../getEntries'); + +module.exports = (config, rootDir) => { + setWebBuild(config, rootDir); + + const entries = getEntries(rootDir); + + config.entryPoints.clear(); + + Object.keys(entries).forEach((key) => { + config.entry(key) + .add(entries[key]); + }); + + config.optimization + .clear() + .minimize(false); +}; diff --git a/packages/rax-plugin-ssr/src/ssr/setDev.js b/packages/rax-plugin-ssr/src/ssr/setDev.js new file mode 100644 index 0000000000..2c2bdc6406 --- /dev/null +++ b/packages/rax-plugin-ssr/src/ssr/setDev.js @@ -0,0 +1,18 @@ +'use strict'; + +const { setWebDev } = require('rax-plugin-app'); + +const getEntries = require('../getEntries'); + +module.exports = (config, rootDir) => { + setWebDev(config, rootDir); + + const entries = getEntries(rootDir); + + config.entryPoints.clear(); + + Object.keys(entries).forEach((key) => { + config.entry(key) + .add(entries[key]); + }); +}; diff --git a/packages/rax-scripts/package.json b/packages/rax-scripts/package.json index f31afcecf9..f65da4aebc 100644 --- a/packages/rax-scripts/package.json +++ b/packages/rax-scripts/package.json @@ -98,7 +98,7 @@ "rax-ssr-dev-server": "^1.0.0", "rax-webpack-plugin": "^0.6.5", "rimraf": "^2.6.2", - "scripts-core": "0.1.0-1", + "scripts-core": "^0.1.0-1", "strip-ansi": "^5.0.0", "stylesheet-loader": "^0.6.5", "ts-loader": "^5.3.3", diff --git a/packages/raxappTest/link.sh b/packages/raxappTest/link.sh index 911c4f0b12..3084715e84 100755 --- a/packages/raxappTest/link.sh +++ b/packages/raxappTest/link.sh @@ -3,6 +3,7 @@ npm link ../raxappTest/node_modules/rax npm link ../universal-app-shell-loader cd ../rax-plugin-ssr +npm link ../rax-plugin-app npm link ../raxappTest/node_modules/rax cd ../universal-app-runtime From 0dc377917694a23717de8cc14405e0b7a97cd32b Mon Sep 17 00:00:00 2001 From: Orange-C <741434157@qq.com> Date: Thu, 1 Aug 2019 11:56:36 +0800 Subject: [PATCH 04/45] feat: plugin app add export --- packages/rax-plugin-app/src/index.js | 32 +++++++++++++++++----------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/packages/rax-plugin-app/src/index.js b/packages/rax-plugin-app/src/index.js index e64be7a33f..d0c38f1ae6 100644 --- a/packages/rax-plugin-app/src/index.js +++ b/packages/rax-plugin-app/src/index.js @@ -1,22 +1,24 @@ -const pluginApp = ({ chainWebpack, registerConfig, rootDir }, options = {}) => { +const pluginApp = ({ chainweexpack, registerConfig, rootDir }, options = {}) => { const { targets = [] } = options; targets.forEach(target => { - const getBase = require(`./config/${target}/getBase`); - const setDev = require(`./config/${target}/setDev`); - const setBuild = require(`./config/${target}/setBuild`); + if (target === 'weex' || target === 'weex') { + const getBase = require(`./config/${target}/getBase`); + const setDev = require(`./config/${target}/setDev`); + const setBuild = require(`./config/${target}/setBuild`); - registerConfig(target, getBase(rootDir)); + registerConfig(target, getBase(rootDir)); - chainWebpack((config, { command }) => { - if (command === 'dev') { - setDev(config.get(target), rootDir); - } + chainweexpack((config, { command }) => { + if (command === 'dev') { + setDev(config.get(target), rootDir); + } - if (command === 'build') { - setBuild(config.get(target), rootDir); - } - }); + if (command === 'build') { + setBuild(config.get(target), rootDir); + } + }); + } }); }; @@ -24,4 +26,8 @@ pluginApp.getWebBase = require('./config/web/getBase'); pluginApp.setWebDev = require('./config/web/setDev'); pluginApp.setWebBuild = require('./config/web/setBuild'); +pluginApp.getWeexBase = require('./config/weex/getBase'); +pluginApp.setWeexDev = require('./config/weex/setDev'); +pluginApp.setWeexBuild = require('./config/weex/setBuild'); + module.exports = pluginApp; From fe37e73bf2e1a8c924715cc0082c70d4dba87285 Mon Sep 17 00:00:00 2001 From: Orange-C <741434157@qq.com> Date: Thu, 1 Aug 2019 12:21:45 +0800 Subject: [PATCH 05/45] fix: fix weex --- packages/rax-plugin-app/src/index.js | 6 +++--- packages/raxappTest/link.sh | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/rax-plugin-app/src/index.js b/packages/rax-plugin-app/src/index.js index d0c38f1ae6..acbeeb4399 100644 --- a/packages/rax-plugin-app/src/index.js +++ b/packages/rax-plugin-app/src/index.js @@ -1,15 +1,15 @@ -const pluginApp = ({ chainweexpack, registerConfig, rootDir }, options = {}) => { +const pluginApp = ({ chainWebpack, registerConfig, rootDir }, options = {}) => { const { targets = [] } = options; targets.forEach(target => { - if (target === 'weex' || target === 'weex') { + if (target === 'web' || target === 'weex') { const getBase = require(`./config/${target}/getBase`); const setDev = require(`./config/${target}/setDev`); const setBuild = require(`./config/${target}/setBuild`); registerConfig(target, getBase(rootDir)); - chainweexpack((config, { command }) => { + chainWebpack((config, { command }) => { if (command === 'dev') { setDev(config.get(target), rootDir); } diff --git a/packages/raxappTest/link.sh b/packages/raxappTest/link.sh index 3084715e84..b4ac221fb1 100755 --- a/packages/raxappTest/link.sh +++ b/packages/raxappTest/link.sh @@ -12,4 +12,5 @@ npm link ../raxappTest/node_modules/rax cd ../raxappTest npm link ../rax-scripts npm link ../rax-plugin-app +npm link ../rax-plugin-ssr npm link ../universal-app-runtime From 052298e38f68c264493d714ffcadca7cb816ab49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E6=BE=9C?= Date: Thu, 1 Aug 2019 15:32:22 +0800 Subject: [PATCH 06/45] feat: server side render --- packages/rax-plugin-ssr/package.json | 1 + packages/rax-plugin-ssr/src/getEntries.js | 45 +++++---- packages/rax-plugin-ssr/src/index.js | 2 +- packages/rax-plugin-ssr/src/loader.js | 97 ++++++++++++++++++++ packages/rax-plugin-ssr/src/runSSRDev.js | 17 +++- packages/rax-plugin-ssr/src/setSSRBase.js | 3 +- packages/rax-ssr-dev-server/index.js | 61 ++---------- packages/rax-ssr-dev-server/package.json | 1 - packages/universal-app-runtime/src/router.js | 11 ++- 9 files changed, 161 insertions(+), 77 deletions(-) create mode 100644 packages/rax-plugin-ssr/src/loader.js diff --git a/packages/rax-plugin-ssr/package.json b/packages/rax-plugin-ssr/package.json index 214a6bb826..4b8412063f 100644 --- a/packages/rax-plugin-ssr/package.json +++ b/packages/rax-plugin-ssr/package.json @@ -20,6 +20,7 @@ "lodash.clone": "^4.5.0", "lodash.clonedeep": "^4.5.0", "rax-pwa-webpack-plugin": "^1.0.0-0", + "rax-server-renderer": "^1.1.0", "rax-ssr-dev-server": "^1.0.0", "webpack": "^4.38.0" } diff --git a/packages/rax-plugin-ssr/src/getEntries.js b/packages/rax-plugin-ssr/src/getEntries.js index 8fd615c175..b49703648b 100644 --- a/packages/rax-plugin-ssr/src/getEntries.js +++ b/packages/rax-plugin-ssr/src/getEntries.js @@ -1,32 +1,39 @@ const path = require('path'); -const fs = require('fs-extra'); +const qs = require('querystring'); + +const SSRLoader = require.resolve('./loader'); module.exports = (rootDir) => { const appDirectory = rootDir; const appSrc = path.resolve(appDirectory, 'src'); - const entries = {}; + const absoluteAppPath = path.join(appDirectory, 'src/app.js'); + const absoluteAppJSONPath = path.join(appDirectory, 'src/app.json'); + const absoluteDocumentPath = path.join(appDirectory, 'src/document/index.jsx'); + const absoluteShellPath = path.join(appDirectory, 'src/shell/index.jsx'); - const files = fs.readdirSync(path.resolve(appSrc, 'pages')); - files.map((file) => { - const absolutePath = path.resolve(appSrc, 'pages', file); - const pathStat = fs.statSync(absolutePath); + const appJSON = require(absoluteAppJSONPath); + const routes = appJSON.routes; - if (pathStat.isDirectory()) { - const relativePath = path.relative(appDirectory, absolutePath); - entries[file] = './' + path.join(relativePath, '/'); - } - }); + const entries = {}; + + routes.forEach((route) => { + const entry = route.name || route.component.replace(/\//g, '_'); + const absolutePagePath = path.resolve(appSrc, route.component); - const documentPath = path.resolve(appSrc, 'document/index.jsx'); - if (fs.existsSync(documentPath)) { - entries._document = documentPath; - } + const query = { + path: route.path, + absoluteDocumentPath, + absoluteShellPath, + absoluteAppPath, + absolutePagePath, + absoluteAppJSONPath, + // errorPath: path.join(appDirectory, 'src/pages/error/index.jsx'), // 从 route 中读取 + // assetsManifestPath: pathConfig.assetsManifest + }; - const shellPath = path.resolve(appSrc, 'shell/index.jsx'); - if (fs.existsSync(shellPath)) { - entries._shell = shellPath; - } + entries[entry] = `${SSRLoader}?${qs.stringify(query)}!${absolutePagePath}`; + }); return entries; }; diff --git a/packages/rax-plugin-ssr/src/index.js b/packages/rax-plugin-ssr/src/index.js index 9da59b3352..844982fdc0 100644 --- a/packages/rax-plugin-ssr/src/index.js +++ b/packages/rax-plugin-ssr/src/index.js @@ -24,7 +24,7 @@ module.exports = ({ chainWebpack, registerConfig, rootDir, onHook, log }) => { } onHook('after.dev', () => { - runSSRDev(ssrConfig, log); + runSSRDev(ssrConfig, rootDir, log); }); }); }; diff --git a/packages/rax-plugin-ssr/src/loader.js b/packages/rax-plugin-ssr/src/loader.js new file mode 100644 index 0000000000..d748d57e50 --- /dev/null +++ b/packages/rax-plugin-ssr/src/loader.js @@ -0,0 +1,97 @@ +const { parse } = require('querystring'); +const fs = require('fs'); + +module.exports = function(content) { + const query = typeof this.query === 'string' ? parse(this.query.substr(1)) : this.query; + + const { + absoluteDocumentPath, + absoluteShellPath, + absoluteAppPath, + absolutePagePath, + absoluteAppJSONPath + } = query; + + const hasShell = fs.existsSync(absoluteShellPath); + const shellStr = hasShell ? `import Shell from '${absoluteShellPath}'` : 'const Shell = function (props) { return props.children };'; + + return ` + import { createElement } from 'rax'; + import renderer from 'rax-server-renderer'; + + import App from '${absoluteAppPath}'; + import Page from '${absolutePagePath}'; + import Document from '${absoluteDocumentPath}'; + import appJSON from '${absoluteAppJSONPath}'; + + ${shellStr} + + async function renderComponentToHTML(req, res, Component) { + const ctx = { + req, + res + }; + + const shellData = await getInitialProps(Shell, ctx); + const appData = await getInitialProps(App, ctx); + const pageData = await getInitialProps(Component, ctx); + + const initialData = { + shellData, + appData, + pageData + }; + + const contentElement = createElement(Shell, null, createElement(App, { + routerConfig: { + defaultComponet: Component, + routes: appJSON.routes + } + })); + + const contentHtml = renderer.renderToString(contentElement); + + const documentProps = { + pageHtml: contentHtml, + pageData: JSON.stringify(initialData) + }; + + await getInitialProps(Document, ctx); + const documentElement = createElement(Document, documentProps);; + const html = '' + renderer.renderToString(documentElement); + + return html; + } + + export async function render(req, res) { + const html = await renderToHTML(req, res); + + res.setHeader('Content-Type', 'text/html; charset=utf-8'); + res.send(html); + } + + export async function renderToHTML(req, res) { + const html = await renderComponentToHTML(req, res, Page); + return html; + } + + async function getInitialProps(Component, ctx) { + if (!Component.getInitialProps) return null; + + const props = await Component.getInitialProps(ctx); + + if (!props || typeof props !== 'object') { + const message = '"getInitialProps()" should resolve to an object. But found "' + props + '" instead.'; + throw new Error(message); + } + + if (Component.defaultProps) { + Component.defaultProps = Object.assign({}, props, Component.defaultProps); + } else { + Component.defaultProps = props; + } + + return props; + } + `; +}; diff --git a/packages/rax-plugin-ssr/src/runSSRDev.js b/packages/rax-plugin-ssr/src/runSSRDev.js index ef7afcc1fd..cff1474555 100644 --- a/packages/rax-plugin-ssr/src/runSSRDev.js +++ b/packages/rax-plugin-ssr/src/runSSRDev.js @@ -1,14 +1,29 @@ +const path = require('path'); const chalk = require('chalk'); const address = require('address'); const deepmerge = require('deepmerge'); const webpack = require('webpack'); const SSRDevServer = require('rax-ssr-dev-server'); -module.exports = (config, log) => { +module.exports = (config, rootDir, log) => { const webpackConfig = config.toConfig(); + + const absoluteAppJSONPath = path.join(rootDir, 'src/app.json'); + const appJSON = require(absoluteAppJSONPath); + + const distDir = config.output.get('path'); + const filename = config.output.get('filename'); + + const routes = {}; + appJSON.routes.forEach((route) => { + const pathName = route.name || route.component.replace(/\//g, '_'); + routes[route.path] = path.join(distDir, filename.replace('[name]', pathName)); + }); + let devServerConfig = { port: 9999, host: address.ip(), + routes }; if (webpackConfig.devServer) { diff --git a/packages/rax-plugin-ssr/src/setSSRBase.js b/packages/rax-plugin-ssr/src/setSSRBase.js index 1639e1e282..f1e433fb59 100644 --- a/packages/rax-plugin-ssr/src/setSSRBase.js +++ b/packages/rax-plugin-ssr/src/setSSRBase.js @@ -16,7 +16,8 @@ module.exports = (config, rootDir) => { .clear() .set('@core/app', 'universal-app-runtime') .set('@core/page', 'universal-app-runtime') - .set('@core/router', 'universal-app-runtime'); + .set('@core/router', 'universal-app-runtime') + .set('rax-server-renderer', require.resolve('rax-server-renderer')); config.target('node'); diff --git a/packages/rax-ssr-dev-server/index.js b/packages/rax-ssr-dev-server/index.js index 9e38bda7a8..c008e6792b 100644 --- a/packages/rax-ssr-dev-server/index.js +++ b/packages/rax-ssr-dev-server/index.js @@ -1,6 +1,5 @@ const fs = require('fs'); const express = require('express'); -const RaxServer = require('rax-server'); const devMiddleware = require('webpack-dev-middleware'); const hotMiddleware = require('webpack-hot-middleware'); const httpProxyMiddleware = require('http-proxy-middleware'); @@ -18,28 +17,21 @@ class DevServer { // eslint-disable-next-line new-cap const router = express.Router(); - const server = new RaxServer(); - const { - pagesManifest, + routes, } = this.options; - Object.keys(pagesManifest).forEach(page => { - // _document, _shell - if (page.indexOf('_') > -1) { - return; - } - - router.get(`/${page}`, (req, res) => { - const pageConfig = this.getPageConfig(res, page); - server.render(req, res, pageConfig); + Object.keys(routes).forEach(routePath => { + router.get(routePath, (req, res) => { + const page = this.loadComponent(routes[routePath], res); + page.render(req, res); }); }); - if (pagesManifest.index) { + if (!routes['/'] && routes['/index']) { router.get('/', (req, res) => { - const pageConfig = this.getPageConfig(res, 'index'); - server.render(req, res, pageConfig); + const page = this.loadComponent(routes['/index'], res); + page.render(req, res); }); } @@ -68,42 +60,7 @@ class DevServer { this.app.listen(port, callback); } - getPageConfig(res, page) { - const { - appConfig = {}, - pagesManifest, - assetsManifest, - assetsManifestPath - } = this.options; - - let assets = assetsManifest || {}; - if (assetsManifestPath) { - const assetsContent = fs.readFileSync(assetsManifestPath, res); - assets = JSON.parse(assetsContent); - }; - - const pageConfig = { - page, - ...assets[page], - component: this.loadComponent(page, res), - document: { - title: appConfig.title, - component: pagesManifest._document ? this.loadComponent('_document', res) : null - }, - shell: { - component: pagesManifest._shell ? this.loadComponent('_shell', res) : null - } - }; - - return pageConfig; - } - - loadComponent(page, res) { - const { - pagesManifest - } = this.options; - - const bundlePath = pagesManifest[page]; + loadComponent(bundlePath, res) { const bundleContent = this.readFileSyncFromWebpack(bundlePath, res); const mod = eval(bundleContent); diff --git a/packages/rax-ssr-dev-server/package.json b/packages/rax-ssr-dev-server/package.json index c66d143f2a..f32d3e3208 100644 --- a/packages/rax-ssr-dev-server/package.json +++ b/packages/rax-ssr-dev-server/package.json @@ -18,7 +18,6 @@ "dependencies": { "express": "^4.17.1", "http-proxy-middleware": "^0.19.1", - "rax-server": "^1.0.0", "webpack-dev-middleware": "^3.7.0", "webpack-hot-middleware": "^2.25.0" } diff --git a/packages/universal-app-runtime/src/router.js b/packages/universal-app-runtime/src/router.js index 37d1e9ed20..275da46f03 100644 --- a/packages/universal-app-runtime/src/router.js +++ b/packages/universal-app-runtime/src/router.js @@ -2,14 +2,21 @@ import { createElement } from 'rax'; import * as RaxUseRouter from 'rax-use-router'; import { createHashHistory } from 'history'; import encodeQS from 'querystring/encode'; +import { isWeb } from 'universal-env'; let _history = null; export function useRouter(routerConfig) { - const { history = createHashHistory(), routes } = routerConfig; - _history = history; + if (isWeb) { + const { history = createHashHistory(), routes } = routerConfig; + _history = history; + } function Router(props) { + if (routerConfig.defaultComponet) { + return createElement(routerConfig.defaultComponet, props); + } + const { component } = RaxUseRouter.useRouter(() => routerConfig); if (!component || Array.isArray(component) && component.length === 0) { From e91073dba396a2ad8e45ea6eecf97f0790086b4c Mon Sep 17 00:00:00 2001 From: Orange-C Date: Thu, 1 Aug 2019 18:53:56 +0800 Subject: [PATCH 07/45] feat: custom server --- packages/rax-plugin-ssr/src/index.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/rax-plugin-ssr/src/index.js b/packages/rax-plugin-ssr/src/index.js index 97e22557a1..7e19beee80 100644 --- a/packages/rax-plugin-ssr/src/index.js +++ b/packages/rax-plugin-ssr/src/index.js @@ -1,4 +1,5 @@ const cloneDeep = require('lodash/cloneDeep'); +const SSRDevServer = require('rax-ssr-dev-server'); const getSSRBase = require('./ssr/getBase'); const setSSRBuild = require('./ssr/setBuild'); @@ -8,21 +9,20 @@ const runSSRDev = require('./ssr/runDev'); const setWebBase = require('./setWebBase'); // can‘t clone webpack chain object -module.exports = ({ chainWebpack, registerConfig, rootDir, onHook, log }) => { +module.exports = ({ chainWebpack, registerConfig, setDevServer, rootDir, onHook, log }) => { chainWebpack((config, { command }) => { const webConfig = config.get('web'); + registerConfig('ssr', getSSRBase(rootDir)); setWebBase(webConfig, rootDir); if (command === 'build') { - registerConfig('ssr', getSSRBase(rootDir)); setSSRBuild(config.get('ssr'), rootDir); } - onHook('after.dev', () => { - const devConfig = getSSRBase(rootDir); - setSSRDev(devConfig, rootDir); - runSSRDev(devConfig, rootDir, log); - }); + if (command === 'dev') { + setDevServer(SSRDevServer); + setSSRDev(config.get('ssr'), rootDir); + } }); }; From 66b4de0da1c4022a34efed8eaff5f22c952e1991 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E6=BE=9C?= Date: Thu, 1 Aug 2019 23:49:48 +0800 Subject: [PATCH 08/45] refactor: ssr dev config --- packages/rax-plugin-ssr/src/index.js | 4 ++-- .../src/ssr/setDevServerConfig.js | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 packages/rax-plugin-ssr/src/ssr/setDevServerConfig.js diff --git a/packages/rax-plugin-ssr/src/index.js b/packages/rax-plugin-ssr/src/index.js index 7e19beee80..56b58fafde 100644 --- a/packages/rax-plugin-ssr/src/index.js +++ b/packages/rax-plugin-ssr/src/index.js @@ -1,12 +1,11 @@ -const cloneDeep = require('lodash/cloneDeep'); const SSRDevServer = require('rax-ssr-dev-server'); const getSSRBase = require('./ssr/getBase'); const setSSRBuild = require('./ssr/setBuild'); const setSSRDev = require('./ssr/setDev'); -const runSSRDev = require('./ssr/runDev'); const setWebBase = require('./setWebBase'); +const setDevServerConfig = require('./ssr/setDevServerConfig'); // can‘t clone webpack chain object module.exports = ({ chainWebpack, registerConfig, setDevServer, rootDir, onHook, log }) => { @@ -21,6 +20,7 @@ module.exports = ({ chainWebpack, registerConfig, setDevServer, rootDir, onHook, } if (command === 'dev') { + setDevServerConfig(webConfig, rootDir); setDevServer(SSRDevServer); setSSRDev(config.get('ssr'), rootDir); } diff --git a/packages/rax-plugin-ssr/src/ssr/setDevServerConfig.js b/packages/rax-plugin-ssr/src/ssr/setDevServerConfig.js new file mode 100644 index 0000000000..82908b84a9 --- /dev/null +++ b/packages/rax-plugin-ssr/src/ssr/setDevServerConfig.js @@ -0,0 +1,21 @@ +const path = require('path'); +const address = require('address'); + +module.exports = (config, rootDir, log) => { + const absoluteAppJSONPath = path.join(rootDir, 'src/app.json'); + const appJSON = require(absoluteAppJSONPath); + + const distDir = config.output.get('path'); + const filename = config.output.get('filename'); + + const routes = {}; + + appJSON.routes.forEach((route) => { + const pathName = route.name || route.component.replace(/\//g, '_'); + routes[route.path] = path.join(distDir, filename.replace('[name]', pathName)); + }); + + config.devServer.port(9999); + config.devServer.host(address.ip()); + config.devServer.set('routes', routes); +}; From 20a9949364c3bc5b2e5e1ae345a0e9b34990409d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E6=BE=9C?= Date: Fri, 2 Aug 2019 11:07:50 +0800 Subject: [PATCH 09/45] refactor: dev server config --- packages/rax-plugin-ssr/package.json | 1 + packages/rax-plugin-ssr/src/index.js | 21 +++--- .../src/ssr/{getBase.js => getBaseConfig.js} | 9 +++ .../rax-plugin-ssr/src/ssr/getBuildConfig.js | 21 ++++++ ...{setDevServerConfig.js => getDevConfig.js} | 15 +++- .../src/{ => ssr}/getEntries.js | 2 +- .../rax-plugin-ssr/src/{ => ssr}/loader.js | 0 packages/rax-plugin-ssr/src/ssr/runDev.js | 73 ------------------- packages/rax-plugin-ssr/src/ssr/setBuild.js | 22 ------ packages/rax-plugin-ssr/src/ssr/setDev.js | 18 ----- .../{setWebBase.js => web/setBaseConfig.js} | 2 - 11 files changed, 55 insertions(+), 129 deletions(-) rename packages/rax-plugin-ssr/src/ssr/{getBase.js => getBaseConfig.js} (76%) create mode 100644 packages/rax-plugin-ssr/src/ssr/getBuildConfig.js rename packages/rax-plugin-ssr/src/ssr/{setDevServerConfig.js => getDevConfig.js} (65%) rename packages/rax-plugin-ssr/src/{ => ssr}/getEntries.js (96%) rename packages/rax-plugin-ssr/src/{ => ssr}/loader.js (100%) delete mode 100644 packages/rax-plugin-ssr/src/ssr/runDev.js delete mode 100644 packages/rax-plugin-ssr/src/ssr/setBuild.js delete mode 100644 packages/rax-plugin-ssr/src/ssr/setDev.js rename packages/rax-plugin-ssr/src/{setWebBase.js => web/setBaseConfig.js} (95%) diff --git a/packages/rax-plugin-ssr/package.json b/packages/rax-plugin-ssr/package.json index 50b4fecd8e..60e53f3db9 100644 --- a/packages/rax-plugin-ssr/package.json +++ b/packages/rax-plugin-ssr/package.json @@ -22,6 +22,7 @@ "rax-pwa-webpack-plugin": "^1.0.0-0", "rax-server-renderer": "^1.1.0", "rax-ssr-dev-server": "^1.0.0", + "uglifyjs-webpack-plugin": "^2.2.0", "webpack": "^4.38.0" } } diff --git a/packages/rax-plugin-ssr/src/index.js b/packages/rax-plugin-ssr/src/index.js index 56b58fafde..015bd238b1 100644 --- a/packages/rax-plugin-ssr/src/index.js +++ b/packages/rax-plugin-ssr/src/index.js @@ -1,28 +1,25 @@ const SSRDevServer = require('rax-ssr-dev-server'); -const getSSRBase = require('./ssr/getBase'); -const setSSRBuild = require('./ssr/setBuild'); -const setSSRDev = require('./ssr/setDev'); - -const setWebBase = require('./setWebBase'); -const setDevServerConfig = require('./ssr/setDevServerConfig'); +const getSSRBuildConfig = require('./ssr/getBuildConfig'); +const getSSRDevConfig = require('./ssr/getDevConfig'); +const setWebBaseConfig = require('./web/setBaseConfig'); // can‘t clone webpack chain object module.exports = ({ chainWebpack, registerConfig, setDevServer, rootDir, onHook, log }) => { chainWebpack((config, { command }) => { const webConfig = config.get('web'); - registerConfig('ssr', getSSRBase(rootDir)); - - setWebBase(webConfig, rootDir); + setWebBaseConfig(webConfig, rootDir); + let ssrConfig; if (command === 'build') { - setSSRBuild(config.get('ssr'), rootDir); + ssrConfig = getSSRBuildConfig(rootDir); } if (command === 'dev') { - setDevServerConfig(webConfig, rootDir); + ssrConfig = getSSRDevConfig(rootDir); setDevServer(SSRDevServer); - setSSRDev(config.get('ssr'), rootDir); } + + registerConfig('ssr', ssrConfig); }); }; diff --git a/packages/rax-plugin-ssr/src/ssr/getBase.js b/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js similarity index 76% rename from packages/rax-plugin-ssr/src/ssr/getBase.js rename to packages/rax-plugin-ssr/src/ssr/getBaseConfig.js index 9abb465dc9..d9da722c9d 100644 --- a/packages/rax-plugin-ssr/src/ssr/getBase.js +++ b/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js @@ -1,11 +1,20 @@ 'use strict'; const { getWebBase } = require('rax-plugin-app'); +const getEntries = require('./getEntries'); // Can‘t clone webpack chain object, so generate a new chain and reset config module.exports = (rootDir) => { const config = getWebBase(rootDir); + config.entryPoints.clear(); + + const entries = getEntries(rootDir); + Object.keys(entries).forEach((key) => { + config.entry(key) + .add(entries[key]); + }); + config.resolve.alias .clear() .set('@core/app', 'universal-app-runtime') diff --git a/packages/rax-plugin-ssr/src/ssr/getBuildConfig.js b/packages/rax-plugin-ssr/src/ssr/getBuildConfig.js new file mode 100644 index 0000000000..8737ec0262 --- /dev/null +++ b/packages/rax-plugin-ssr/src/ssr/getBuildConfig.js @@ -0,0 +1,21 @@ +'use strict'; +// const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); +const getBaseWebpackConfig = require('./getBaseConfig'); + +module.exports = (rootDir) => { + const config = getBaseWebpackConfig(rootDir); + + config.mode('production'); + + // config.optimization + // .minimize(true) + // .minimizer('uglify') + // .use(UglifyJSPlugin, [{ + // include: /\.js$/, + // cache: true, + // sourceMap: true, + // }]) + // .end(); + + return config; +}; diff --git a/packages/rax-plugin-ssr/src/ssr/setDevServerConfig.js b/packages/rax-plugin-ssr/src/ssr/getDevConfig.js similarity index 65% rename from packages/rax-plugin-ssr/src/ssr/setDevServerConfig.js rename to packages/rax-plugin-ssr/src/ssr/getDevConfig.js index 82908b84a9..017735f62d 100644 --- a/packages/rax-plugin-ssr/src/ssr/setDevServerConfig.js +++ b/packages/rax-plugin-ssr/src/ssr/getDevConfig.js @@ -1,7 +1,9 @@ +'use strict'; const path = require('path'); const address = require('address'); +const getBaseWebpackConfig = require('./getBaseConfig'); -module.exports = (config, rootDir, log) => { +function setDevServerConfig(config, rootDir) { const absoluteAppJSONPath = path.join(rootDir, 'src/app.json'); const appJSON = require(absoluteAppJSONPath); @@ -15,7 +17,18 @@ module.exports = (config, rootDir, log) => { routes[route.path] = path.join(distDir, filename.replace('[name]', pathName)); }); + config.devServer.hot(false); config.devServer.port(9999); config.devServer.host(address.ip()); config.devServer.set('routes', routes); +} + +module.exports = (rootDir) => { + const config = getBaseWebpackConfig(rootDir); + + config.mode('development'); + + setDevServerConfig(config, rootDir); + + return config; }; diff --git a/packages/rax-plugin-ssr/src/getEntries.js b/packages/rax-plugin-ssr/src/ssr/getEntries.js similarity index 96% rename from packages/rax-plugin-ssr/src/getEntries.js rename to packages/rax-plugin-ssr/src/ssr/getEntries.js index 817190fa6f..b49703648b 100644 --- a/packages/rax-plugin-ssr/src/getEntries.js +++ b/packages/rax-plugin-ssr/src/ssr/getEntries.js @@ -3,7 +3,7 @@ const qs = require('querystring'); const SSRLoader = require.resolve('./loader'); -module.exports = (rootDir, isWeb) => { +module.exports = (rootDir) => { const appDirectory = rootDir; const appSrc = path.resolve(appDirectory, 'src'); diff --git a/packages/rax-plugin-ssr/src/loader.js b/packages/rax-plugin-ssr/src/ssr/loader.js similarity index 100% rename from packages/rax-plugin-ssr/src/loader.js rename to packages/rax-plugin-ssr/src/ssr/loader.js diff --git a/packages/rax-plugin-ssr/src/ssr/runDev.js b/packages/rax-plugin-ssr/src/ssr/runDev.js deleted file mode 100644 index ec544351f3..0000000000 --- a/packages/rax-plugin-ssr/src/ssr/runDev.js +++ /dev/null @@ -1,73 +0,0 @@ -const path = require('path'); -const chalk = require('chalk'); -const address = require('address'); -const deepmerge = require('deepmerge'); -const webpack = require('webpack'); -const SSRDevServer = require('rax-ssr-dev-server'); - - -const getEntries = require('../getEntries'); - -module.exports = (config, rootDir, log) => { - debugger; - const entries = getEntries(rootDir); - const pagesManifest = {}; - Object.keys(entries).forEach(entry => { - pagesManifest[entry] = path.resolve(rootDir, `build/server/${entry}.js`); - }); - - const webpackConfig = config.toConfig(); - - const absoluteAppJSONPath = path.join(rootDir, 'src/app.json'); - const appJSON = require(absoluteAppJSONPath); - - const distDir = config.output.get('path'); - const filename = config.output.get('filename'); - - const routes = {}; - appJSON.routes.forEach((route) => { - const pathName = route.name || route.component.replace(/\//g, '_'); - routes[route.path] = path.join(distDir, filename.replace('[name]', pathName)); - }); - - let devServerConfig = { - port: 10100, - host: address.ip(), - routes - }; - - if (webpackConfig.devServer) { - devServerConfig = deepmerge(devServerConfig, webpackConfig.devServer); - } - - let compiler; - try { - compiler = webpack(webpackConfig); - } catch (err) { - log.error(chalk.red('Failed to load webpack config.')); - log.error(err.message || err); - process.exit(1); - } - - const devServer = new SSRDevServer(compiler, devServerConfig); - - devServer.listen(devServerConfig.port, devServerConfig.host, (err) => { - if (err) { - console.log(chalk.red('[ERR]: Failed to start webpack dev server')); - console.error(err.message || err); - process.exit(1); - } - - const serverUrl = `http://${devServerConfig.host}:${devServerConfig.port}`; - - console.log(chalk.green('[Web] Starting the development server at:')); - console.log(' ', chalk.underline.white(serverUrl)); - - ['SIGINT', 'SIGTERM'].forEach(function(sig) { - process.on(sig, function() { - devServer.close(); - process.exit(); - }); - }); - }); -}; diff --git a/packages/rax-plugin-ssr/src/ssr/setBuild.js b/packages/rax-plugin-ssr/src/ssr/setBuild.js deleted file mode 100644 index b19d27ab96..0000000000 --- a/packages/rax-plugin-ssr/src/ssr/setBuild.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -const { setWebBuild } = require('rax-plugin-app'); - -const getEntries = require('../getEntries'); - -module.exports = (config, rootDir) => { - setWebBuild(config, rootDir); - - const entries = getEntries(rootDir); - - config.entryPoints.clear(); - - Object.keys(entries).forEach((key) => { - config.entry(key) - .add(entries[key]); - }); - - config.optimization - .clear() - .minimize(false); -}; diff --git a/packages/rax-plugin-ssr/src/ssr/setDev.js b/packages/rax-plugin-ssr/src/ssr/setDev.js deleted file mode 100644 index 2c2bdc6406..0000000000 --- a/packages/rax-plugin-ssr/src/ssr/setDev.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -const { setWebDev } = require('rax-plugin-app'); - -const getEntries = require('../getEntries'); - -module.exports = (config, rootDir) => { - setWebDev(config, rootDir); - - const entries = getEntries(rootDir); - - config.entryPoints.clear(); - - Object.keys(entries).forEach((key) => { - config.entry(key) - .add(entries[key]); - }); -}; diff --git a/packages/rax-plugin-ssr/src/setWebBase.js b/packages/rax-plugin-ssr/src/web/setBaseConfig.js similarity index 95% rename from packages/rax-plugin-ssr/src/setWebBase.js rename to packages/rax-plugin-ssr/src/web/setBaseConfig.js index bb3c37e7a2..c7b5e27831 100644 --- a/packages/rax-plugin-ssr/src/setWebBase.js +++ b/packages/rax-plugin-ssr/src/web/setBaseConfig.js @@ -4,8 +4,6 @@ const path = require('path'); const AssetsManifestPlugin = require('rax-pwa-webpack-plugin/lib/AssetsManifestPlugin').default; const { RaxPWAPlugin } = require('rax-pwa-webpack-plugin'); -const getEntries = require('./getEntries'); - module.exports = (config, rootDir) => { config.plugin('raxpwa') .use(RaxPWAPlugin, [{ From 3f6ab41b03898f5f94d132064bea0636a032b501 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E6=BE=9C?= Date: Fri, 2 Aug 2019 12:11:49 +0800 Subject: [PATCH 10/45] refactor: dependencies for ssr --- packages/rax-plugin-ssr/package.json | 1 - packages/rax-plugin-ssr/src/ssr/getBaseConfig.js | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/rax-plugin-ssr/package.json b/packages/rax-plugin-ssr/package.json index 60e53f3db9..d90809d01a 100644 --- a/packages/rax-plugin-ssr/package.json +++ b/packages/rax-plugin-ssr/package.json @@ -20,7 +20,6 @@ "lodash": "^4.17.15", "rax-plugin-app": "^0.1.0-0", "rax-pwa-webpack-plugin": "^1.0.0-0", - "rax-server-renderer": "^1.1.0", "rax-ssr-dev-server": "^1.0.0", "uglifyjs-webpack-plugin": "^2.2.0", "webpack": "^4.38.0" diff --git a/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js b/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js index d9da722c9d..e31bd2262f 100644 --- a/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js +++ b/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js @@ -19,8 +19,7 @@ module.exports = (rootDir) => { .clear() .set('@core/app', 'universal-app-runtime') .set('@core/page', 'universal-app-runtime') - .set('@core/router', 'universal-app-runtime') - .set('rax-server-renderer', require.resolve('rax-server-renderer')); + .set('@core/router', 'universal-app-runtime'); config.target('node'); From 248b13494e6993f5ff222efffa301bf171cc5d8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E6=BE=9C?= Date: Fri, 2 Aug 2019 13:21:32 +0800 Subject: [PATCH 11/45] refactor: documents props --- packages/rax-plugin-ssr/src/ssr/getEntries.js | 3 +-- packages/rax-plugin-ssr/src/ssr/loader.js | 10 ++++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/rax-plugin-ssr/src/ssr/getEntries.js b/packages/rax-plugin-ssr/src/ssr/getEntries.js index b49703648b..a2bfeed0a5 100644 --- a/packages/rax-plugin-ssr/src/ssr/getEntries.js +++ b/packages/rax-plugin-ssr/src/ssr/getEntries.js @@ -28,8 +28,7 @@ module.exports = (rootDir) => { absoluteAppPath, absolutePagePath, absoluteAppJSONPath, - // errorPath: path.join(appDirectory, 'src/pages/error/index.jsx'), // 从 route 中读取 - // assetsManifestPath: pathConfig.assetsManifest + publicPath: '/' }; entries[entry] = `${SSRLoader}?${qs.stringify(query)}!${absolutePagePath}`; diff --git a/packages/rax-plugin-ssr/src/ssr/loader.js b/packages/rax-plugin-ssr/src/ssr/loader.js index d748d57e50..cfa107896c 100644 --- a/packages/rax-plugin-ssr/src/ssr/loader.js +++ b/packages/rax-plugin-ssr/src/ssr/loader.js @@ -9,7 +9,8 @@ module.exports = function(content) { absoluteShellPath, absoluteAppPath, absolutePagePath, - absoluteAppJSONPath + absoluteAppJSONPath, + publicPath } = query; const hasShell = fs.existsSync(absoluteShellPath); @@ -49,11 +50,12 @@ module.exports = function(content) { } })); - const contentHtml = renderer.renderToString(contentElement); + const initialHtml = renderer.renderToString(contentElement); const documentProps = { - pageHtml: contentHtml, - pageData: JSON.stringify(initialData) + initialHtml: initialHtml, + initialData: JSON.stringify(initialData), + publicPath: '${publicPath}' }; await getInitialProps(Document, ctx); From 5f7dc81f5f035c3739f71ed4506fa90fce17cc5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E6=BE=9C?= Date: Fri, 2 Aug 2019 13:59:26 +0800 Subject: [PATCH 12/45] fix: ssr public path --- packages/rax-plugin-ssr/src/ssr/loader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rax-plugin-ssr/src/ssr/loader.js b/packages/rax-plugin-ssr/src/ssr/loader.js index cfa107896c..5137bba87a 100644 --- a/packages/rax-plugin-ssr/src/ssr/loader.js +++ b/packages/rax-plugin-ssr/src/ssr/loader.js @@ -54,7 +54,7 @@ module.exports = function(content) { const documentProps = { initialHtml: initialHtml, - initialData: JSON.stringify(initialData), + initialData: 'window.__initialData__=' + JSON.stringify(initialData), publicPath: '${publicPath}' }; From 7607c786001c43e292c11a9500a561b1113791f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E6=BE=9C?= Date: Fri, 2 Aug 2019 15:19:28 +0800 Subject: [PATCH 13/45] feat: minimize in ssr --- packages/rax-plugin-ssr/package.json | 1 - packages/rax-plugin-ssr/src/ssr/getBuildConfig.js | 13 +++---------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/packages/rax-plugin-ssr/package.json b/packages/rax-plugin-ssr/package.json index d90809d01a..3719e01e79 100644 --- a/packages/rax-plugin-ssr/package.json +++ b/packages/rax-plugin-ssr/package.json @@ -21,7 +21,6 @@ "rax-plugin-app": "^0.1.0-0", "rax-pwa-webpack-plugin": "^1.0.0-0", "rax-ssr-dev-server": "^1.0.0", - "uglifyjs-webpack-plugin": "^2.2.0", "webpack": "^4.38.0" } } diff --git a/packages/rax-plugin-ssr/src/ssr/getBuildConfig.js b/packages/rax-plugin-ssr/src/ssr/getBuildConfig.js index 8737ec0262..83420bf0fb 100644 --- a/packages/rax-plugin-ssr/src/ssr/getBuildConfig.js +++ b/packages/rax-plugin-ssr/src/ssr/getBuildConfig.js @@ -1,5 +1,4 @@ 'use strict'; -// const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); const getBaseWebpackConfig = require('./getBaseConfig'); module.exports = (rootDir) => { @@ -7,15 +6,9 @@ module.exports = (rootDir) => { config.mode('production'); - // config.optimization - // .minimize(true) - // .minimizer('uglify') - // .use(UglifyJSPlugin, [{ - // include: /\.js$/, - // cache: true, - // sourceMap: true, - // }]) - // .end(); + config.optimization + .minimize(true) + .end(); return config; }; From 3a8f05edd15095077f81f9f4ded90821b6fd7e62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E6=BE=9C?= Date: Fri, 2 Aug 2019 16:44:31 +0800 Subject: [PATCH 14/45] feat: ingnore css in ssr --- packages/rax-plugin-ssr/package.json | 4 ++-- packages/rax-plugin-ssr/src/ssr/getBaseConfig.js | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/rax-plugin-ssr/package.json b/packages/rax-plugin-ssr/package.json index 3719e01e79..074dd29156 100644 --- a/packages/rax-plugin-ssr/package.json +++ b/packages/rax-plugin-ssr/package.json @@ -13,6 +13,7 @@ }, "homepage": "https://github.com/alibaba/rax#readme", "dependencies": { + "webpack": "^4.39.0", "address": "^1.1.0", "chalk": "^2.4.2", "deepmerge": "^4.0.0", @@ -20,7 +21,6 @@ "lodash": "^4.17.15", "rax-plugin-app": "^0.1.0-0", "rax-pwa-webpack-plugin": "^1.0.0-0", - "rax-ssr-dev-server": "^1.0.0", - "webpack": "^4.38.0" + "rax-ssr-dev-server": "^1.0.0" } } diff --git a/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js b/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js index e31bd2262f..bbb2594de3 100644 --- a/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js +++ b/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js @@ -1,5 +1,5 @@ 'use strict'; - +const webpack = require('webpack'); const { getWebBase } = require('rax-plugin-app'); const getEntries = require('./getEntries'); @@ -31,6 +31,13 @@ module.exports = (rootDir) => { rax: 'rax', }); + config.plugins.delete('minicss'); + + config.plugin('ingnorecss') + .use(webpack.IgnorePlugin, [{ + resourceRegExp: /\.css?$/ + }]); + config.plugins.delete('document'); return config; From 3c36ccda080be1d9795532370d6d3457f84f36e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E6=BE=9C?= Date: Fri, 2 Aug 2019 16:56:59 +0800 Subject: [PATCH 15/45] refactor: web config in ssr --- packages/rax-plugin-ssr/package.json | 5 --- .../rax-plugin-ssr/src/web/setBaseConfig.js | 32 ------------------- 2 files changed, 37 deletions(-) diff --git a/packages/rax-plugin-ssr/package.json b/packages/rax-plugin-ssr/package.json index 074dd29156..7d2ebba727 100644 --- a/packages/rax-plugin-ssr/package.json +++ b/packages/rax-plugin-ssr/package.json @@ -15,12 +15,7 @@ "dependencies": { "webpack": "^4.39.0", "address": "^1.1.0", - "chalk": "^2.4.2", - "deepmerge": "^4.0.0", - "fs-extra": "^8.1.0", - "lodash": "^4.17.15", "rax-plugin-app": "^0.1.0-0", - "rax-pwa-webpack-plugin": "^1.0.0-0", "rax-ssr-dev-server": "^1.0.0" } } diff --git a/packages/rax-plugin-ssr/src/web/setBaseConfig.js b/packages/rax-plugin-ssr/src/web/setBaseConfig.js index c7b5e27831..9b59856a3a 100644 --- a/packages/rax-plugin-ssr/src/web/setBaseConfig.js +++ b/packages/rax-plugin-ssr/src/web/setBaseConfig.js @@ -1,37 +1,5 @@ 'use strict'; -const path = require('path'); -const AssetsManifestPlugin = require('rax-pwa-webpack-plugin/lib/AssetsManifestPlugin').default; -const { RaxPWAPlugin } = require('rax-pwa-webpack-plugin'); - module.exports = (config, rootDir) => { - config.plugin('raxpwa') - .use(RaxPWAPlugin, [{ - pathConfig: { - appDirectory: rootDir, - appSrc: path.resolve(rootDir, 'src'), - appShell: path.resolve(rootDir, 'src/shell/index.js'), - appDocument: path.resolve(rootDir, 'src/document/index.js'), - appHtml: path.resolve(rootDir, 'public/index.html'), - }, - appConfig: { - title: 'test_title', - pages: { - home: { - path: '/home', - title: 'homePage', - } - }, - spa: true, - ssr: true - } - }]); - - config.plugin('assetsManifest') - .use(AssetsManifestPlugin, [{ - dist: path.resolve(rootDir, '.temp/assets_manifest.json'), - publicPath: path.resolve(rootDir, 'public') - }]); - return config; }; From 324ae7be8c704ceba5c00fe63a0648e106aa3762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E6=BE=9C?= Date: Fri, 2 Aug 2019 17:53:22 +0800 Subject: [PATCH 16/45] revert: ignore css in ssr --- packages/rax-plugin-ssr/src/ssr/getBaseConfig.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js b/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js index bbb2594de3..9473617db4 100644 --- a/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js +++ b/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js @@ -31,12 +31,12 @@ module.exports = (rootDir) => { rax: 'rax', }); - config.plugins.delete('minicss'); + // config.plugins.delete('minicss'); - config.plugin('ingnorecss') - .use(webpack.IgnorePlugin, [{ - resourceRegExp: /\.css?$/ - }]); + // config.plugin('ingnorecss') + // .use(webpack.IgnorePlugin, [{ + // resourceRegExp: /\.css?$/ + // }]); config.plugins.delete('document'); From 7500552aa8c177cb3324660f0946dd1c0eac368b Mon Sep 17 00:00:00 2001 From: yangfan <18767120422@163.com> Date: Fri, 2 Aug 2019 17:54:04 +0800 Subject: [PATCH 17/45] feat: add SSR client --- packages/rax-plugin-ssr/src/index.js | 5 +- .../rax-plugin-ssr/src/ssr/getBaseConfig.js | 1 + .../rax-plugin-ssr/src/web/setBaseConfig.js | 37 --------------- .../universal-app-shell-loader/src/index.js | 47 ++++++++++++++++--- 4 files changed, 43 insertions(+), 47 deletions(-) delete mode 100644 packages/rax-plugin-ssr/src/web/setBaseConfig.js diff --git a/packages/rax-plugin-ssr/src/index.js b/packages/rax-plugin-ssr/src/index.js index 015bd238b1..5c875215ff 100644 --- a/packages/rax-plugin-ssr/src/index.js +++ b/packages/rax-plugin-ssr/src/index.js @@ -2,14 +2,11 @@ const SSRDevServer = require('rax-ssr-dev-server'); const getSSRBuildConfig = require('./ssr/getBuildConfig'); const getSSRDevConfig = require('./ssr/getDevConfig'); -const setWebBaseConfig = require('./web/setBaseConfig'); + // can‘t clone webpack chain object module.exports = ({ chainWebpack, registerConfig, setDevServer, rootDir, onHook, log }) => { chainWebpack((config, { command }) => { - const webConfig = config.get('web'); - setWebBaseConfig(webConfig, rootDir); - let ssrConfig; if (command === 'build') { ssrConfig = getSSRBuildConfig(rootDir); diff --git a/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js b/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js index e31bd2262f..ec1baaf852 100644 --- a/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js +++ b/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js @@ -32,6 +32,7 @@ module.exports = (rootDir) => { }); config.plugins.delete('document'); + config.plugins.delete('PWAAppShell'); return config; }; diff --git a/packages/rax-plugin-ssr/src/web/setBaseConfig.js b/packages/rax-plugin-ssr/src/web/setBaseConfig.js deleted file mode 100644 index c7b5e27831..0000000000 --- a/packages/rax-plugin-ssr/src/web/setBaseConfig.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict'; - -const path = require('path'); -const AssetsManifestPlugin = require('rax-pwa-webpack-plugin/lib/AssetsManifestPlugin').default; -const { RaxPWAPlugin } = require('rax-pwa-webpack-plugin'); - -module.exports = (config, rootDir) => { - config.plugin('raxpwa') - .use(RaxPWAPlugin, [{ - pathConfig: { - appDirectory: rootDir, - appSrc: path.resolve(rootDir, 'src'), - appShell: path.resolve(rootDir, 'src/shell/index.js'), - appDocument: path.resolve(rootDir, 'src/document/index.js'), - appHtml: path.resolve(rootDir, 'public/index.html'), - }, - appConfig: { - title: 'test_title', - pages: { - home: { - path: '/home', - title: 'homePage', - } - }, - spa: true, - ssr: true - } - }]); - - config.plugin('assetsManifest') - .use(AssetsManifestPlugin, [{ - dist: path.resolve(rootDir, '.temp/assets_manifest.json'), - publicPath: path.resolve(rootDir, 'public') - }]); - - return config; -}; diff --git a/packages/universal-app-shell-loader/src/index.js b/packages/universal-app-shell-loader/src/index.js index 59db0e8c5e..eb30bf3053 100644 --- a/packages/universal-app-shell-loader/src/index.js +++ b/packages/universal-app-shell-loader/src/index.js @@ -35,17 +35,47 @@ module.exports = function(content) { * Web only compatible with 750rpx. */ if (options.type === 'web') { + let appRenderMethod = ''; const mutiple = options.mutiple || 100; fixRootStyle = ` const html = document.documentElement; html.style.fontSize = html.clientWidth / 750 * ${mutiple} + 'px'; `; - appRender = 'render(createElement(Entry), document.getElementById("root"), { driver: DriverUniversal });'; - // app shell if (existsSync(join(this.rootContext, 'src/shell/index.jsx'))) { - appRender = `import Shell from "${getDepPath('shell/index', this.rootContext)}";`; - appRender += 'render(createElement(Shell, {}, createElement(Entry)), document.getElementById("root"), { driver: DriverUniversal, hydrate: true });'; + // app shell + appRender += `import Shell from "${getDepPath('shell/index', this.rootContext)}";`; + appRenderMethod = ` + // process Shell.getInitialProps + const shellProps = {}; + if (withSSR && window.__initialData__.shellData !== null) { + Object.assign(shellProps, window.__initialData__.shellData); + } else if (Shell.getInitialProps) { + Object.assign(shellProps, await Shell.getInitialProps()); + } + render(createElement(Shell, shellProps, createElement(Entry)), document.getElementById("root"), { driver: DriverUniversal, hydrate: true }); + `; + } else { + // common web app + appRenderMethod = 'render(createElement(Entry), document.getElementById("root"), { driver: DriverUniversal, hydrate: withSSR });'; } + + appRender += ` + const renderApp = async function() { + // process SSR History + if (withSSR) { + Object.assign(appProps, window.__initialData__.appData); + } + + // process App.getInitialProps + if (withSSR && window.__initialData__.appData !== null) { + Object.assign(appProps, window.__initialData__.appData); + } else if (definedApp.getInitialProps) { + Object.assign(appProps, await definedApp.getInitialProps()); + } + ${appRenderMethod} + } + renderApp(); + `; } /** @@ -60,7 +90,11 @@ module.exports = function(content) { const assembleRoutes = routes.map((route, index) => { // First level function to support hooks will autorun function type state, // Second level function to support rax-use-router rule autorun function type component. - const dynamicImportComponent = `() => import(/* webpackChunkName: "${route.component.replace(/\//g, '_')}" */ '${getDepPath(route.component, this.rootContext)}').then((mod) => () => interopRequire(mod))`; + const dynamicImportComponent = + `() => + import(/* webpackChunkName: "${route.component.replace(/\//g, '_')}" */ '${getDepPath(route.component, this.rootContext)}') + .then((mod) => { return () => interopRequire(mod)}) + `; const importComponent = `() => () => interopRequire(require('${getDepPath(route.component, this.rootContext)}'))`; return `routes.push({ @@ -78,7 +112,8 @@ module.exports = function(content) { import DriverUniversal from 'driver-universal'; const interopRequire = (mod) => mod && mod.__esModule ? mod.default : mod; - + const withSSR = !!window.__initialData__; + const getRouterConfig = () => { const routes = []; ${assembleRoutes} From cd5db2f37d7096bb436aaf96720f90f12bbf2e7d Mon Sep 17 00:00:00 2001 From: yangfan <18767120422@163.com> Date: Fri, 2 Aug 2019 18:05:01 +0800 Subject: [PATCH 18/45] fix: delete web config --- packages/rax-plugin-ssr/src/web/setBaseConfig.js | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 packages/rax-plugin-ssr/src/web/setBaseConfig.js diff --git a/packages/rax-plugin-ssr/src/web/setBaseConfig.js b/packages/rax-plugin-ssr/src/web/setBaseConfig.js deleted file mode 100644 index 9b59856a3a..0000000000 --- a/packages/rax-plugin-ssr/src/web/setBaseConfig.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -module.exports = (config, rootDir) => { - return config; -}; From fe6ca8257a8b7ac43b1e411fb389797d74afea75 Mon Sep 17 00:00:00 2001 From: yangfan <18767120422@163.com> Date: Fri, 2 Aug 2019 21:09:05 +0800 Subject: [PATCH 19/45] feat: add page getInitialProps --- packages/universal-app-runtime/src/router.js | 50 ++++++++++++++++++- .../universal-app-shell-loader/src/index.js | 4 +- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/packages/universal-app-runtime/src/router.js b/packages/universal-app-runtime/src/router.js index b8a6de7cff..2f0c634fd2 100644 --- a/packages/universal-app-runtime/src/router.js +++ b/packages/universal-app-runtime/src/router.js @@ -1,4 +1,4 @@ -import { createElement, useRef, useImperativeHandle } from 'rax'; +import { createElement, useRef, useState, useImperativeHandle } from 'rax'; import * as RaxUseRouter from 'rax-use-router'; import { isWeex, isWeb } from 'universal-env'; import { createHashHistory } from 'history'; @@ -6,6 +6,25 @@ import encodeQS from 'querystring/encode'; let _history = null; let _routerConfig = {}; +// current process Page.getInitialProps page +let _currentComponent = null; +// current process Page.getInitialProps props +let _currentInitialPropsProps = {}; +// html first SSR InitialPropsProps +let _currentSSRInitialPropsProps = null; +// Mark if the page is loaded for the first time. +// If it is the first time to load, SSR pageInitialProps is taken from the scripts. +// If the SPA has switched routes then each sub-component needs to run getInitialProps +let _isReadSSRInitialPropsProps = false; + +try { + if (window.__initialData__) { + _currentSSRInitialPropsProps = window.__initialData__.pageData; + } +} catch (e) { + // ignore SSR window is not defined +} + export function useRouter(routerConfig) { _routerConfig = routerConfig; @@ -16,6 +35,8 @@ export function useRouter(routerConfig) { } function Router(props) { + const [updateFlag, setUpdateFlag] = useState(0); + if (routerConfig.defaultComponet) { return createElement(routerConfig.defaultComponet, props); } @@ -26,7 +47,32 @@ export function useRouter(routerConfig) { // Return null directly if not matched. return null; } else { - return createElement(component, props); + // process Page.getInitialProps + if (_currentComponent !== component) { + _currentInitialPropsProps = {}; + _currentComponent = component; + + // SSR project the first time is initialized from global data, + // after that the data will be obtained from the component's own getInitialProps + if (_currentSSRInitialPropsProps && !_isReadSSRInitialPropsProps) { + // After routing switching, it is considered not the first rendering. + _isReadSSRInitialPropsProps = true; + _currentInitialPropsProps = _currentSSRInitialPropsProps; + } else if (component.getInitialProps) { + let newUpdateFlag = updateFlag + 1; + // wait getInitialProps + component.getInitialProps().then((props) => { + setUpdateFlag(newUpdateFlag); + _currentInitialPropsProps = props; + }, () => { + setUpdateFlag(++newUpdateFlag); + _currentInitialPropsProps = {}; + }); + return null; + } + } + + return createElement(component, { ...props, ..._currentInitialPropsProps }); } } diff --git a/packages/universal-app-shell-loader/src/index.js b/packages/universal-app-shell-loader/src/index.js index eb30bf3053..762086cd53 100644 --- a/packages/universal-app-shell-loader/src/index.js +++ b/packages/universal-app-shell-loader/src/index.js @@ -92,8 +92,8 @@ module.exports = function(content) { // Second level function to support rax-use-router rule autorun function type component. const dynamicImportComponent = `() => - import(/* webpackChunkName: "${route.component.replace(/\//g, '_')}" */ '${getDepPath(route.component, this.rootContext)}') - .then((mod) => { return () => interopRequire(mod)}) + import(/* webpackChunkName: "${route.component.replace(/\//g, '_')}" */ '${getDepPath(route.component, this.rootContext)}') + .then((mod) => () => interopRequire(mod)) `; const importComponent = `() => () => interopRequire(require('${getDepPath(route.component, this.rootContext)}'))`; From 008b25334aaad70fceb191e1304e9efb4e474ae3 Mon Sep 17 00:00:00 2001 From: yangfan <18767120422@163.com> Date: Sat, 3 Aug 2019 01:24:12 +0800 Subject: [PATCH 20/45] feat: update --- packages/universal-app-runtime/src/router.js | 43 ++++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/packages/universal-app-runtime/src/router.js b/packages/universal-app-runtime/src/router.js index 2f0c634fd2..13f73b837f 100644 --- a/packages/universal-app-runtime/src/router.js +++ b/packages/universal-app-runtime/src/router.js @@ -6,20 +6,21 @@ import encodeQS from 'querystring/encode'; let _history = null; let _routerConfig = {}; -// current process Page.getInitialProps page -let _currentComponent = null; -// current process Page.getInitialProps props -let _currentInitialPropsProps = {}; -// html first SSR InitialPropsProps -let _currentSSRInitialPropsProps = null; + +// current process Page.getInitialProps path +let _currentPagePath; +// The initialProps +let _initialProps = {}; +// The initialPropsProps from SSR +let _initialPropsFromSSR = null; // Mark if the page is loaded for the first time. // If it is the first time to load, SSR pageInitialProps is taken from the scripts. // If the SPA has switched routes then each sub-component needs to run getInitialProps -let _isReadSSRInitialPropsProps = false; +let _isReadInitialPropsFromSSR = false; try { if (window.__initialData__) { - _currentSSRInitialPropsProps = window.__initialData__.pageData; + _initialPropsFromSSR = window.__initialData__.pageData; } } catch (e) { // ignore SSR window is not defined @@ -35,7 +36,7 @@ export function useRouter(routerConfig) { } function Router(props) { - const [updateFlag, setUpdateFlag] = useState(0); + const [currentPath, setCurrentPath] = useState(''); if (routerConfig.defaultComponet) { return createElement(routerConfig.defaultComponet, props); @@ -48,31 +49,29 @@ export function useRouter(routerConfig) { return null; } else { // process Page.getInitialProps - if (_currentComponent !== component) { - _currentInitialPropsProps = {}; - _currentComponent = component; - + if (currentPath !== _currentPagePath) { + _initialProps = {}; + _currentPagePath = _history.location.pathname; // SSR project the first time is initialized from global data, // after that the data will be obtained from the component's own getInitialProps - if (_currentSSRInitialPropsProps && !_isReadSSRInitialPropsProps) { + if (_initialPropsFromSSR !== null && !_isReadInitialPropsFromSSR) { // After routing switching, it is considered not the first rendering. - _isReadSSRInitialPropsProps = true; - _currentInitialPropsProps = _currentSSRInitialPropsProps; + _initialProps = _initialPropsFromSSR; + _isReadInitialPropsFromSSR = true; } else if (component.getInitialProps) { - let newUpdateFlag = updateFlag + 1; // wait getInitialProps component.getInitialProps().then((props) => { - setUpdateFlag(newUpdateFlag); - _currentInitialPropsProps = props; + setCurrentPath(_currentPagePath); + _initialProps = props; }, () => { - setUpdateFlag(++newUpdateFlag); - _currentInitialPropsProps = {}; + setCurrentPath(_currentPagePath); + _initialProps = {}; }); return null; } } - return createElement(component, { ...props, ..._currentInitialPropsProps }); + return createElement(component, { ...props, ..._initialProps }); } } From f4579046fbe9b00c38195bb2cd572270cb86e0d3 Mon Sep 17 00:00:00 2001 From: yangfan <18767120422@163.com> Date: Sat, 3 Aug 2019 01:27:03 +0800 Subject: [PATCH 21/45] fix: lint --- packages/rax-plugin-app/src/index.js | 1 - packages/universal-app-runtime/src/router.js | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/rax-plugin-app/src/index.js b/packages/rax-plugin-app/src/index.js index f203c20914..7edeba2826 100644 --- a/packages/rax-plugin-app/src/index.js +++ b/packages/rax-plugin-app/src/index.js @@ -5,7 +5,6 @@ const pluginApp = ({ chainWebpack, registerConfig, rootDir, onHook }, options = targets.forEach(target => { if (target === 'web' || target === 'weex') { - const getBase = require(`./config/${target}/getBase`); const setDev = require(`./config/${target}/setDev`); const setBuild = require(`./config/${target}/setBuild`); diff --git a/packages/universal-app-runtime/src/router.js b/packages/universal-app-runtime/src/router.js index 13f73b837f..24db15d650 100644 --- a/packages/universal-app-runtime/src/router.js +++ b/packages/universal-app-runtime/src/router.js @@ -61,11 +61,11 @@ export function useRouter(routerConfig) { } else if (component.getInitialProps) { // wait getInitialProps component.getInitialProps().then((props) => { - setCurrentPath(_currentPagePath); _initialProps = props; - }, () => { setCurrentPath(_currentPagePath); + }, () => { _initialProps = {}; + setCurrentPath(_currentPagePath); }); return null; } From ef97e85f848462f257cba1c7fc6a715ad87f5045 Mon Sep 17 00:00:00 2001 From: yangfan <18767120422@163.com> Date: Sat, 3 Aug 2019 01:58:14 +0800 Subject: [PATCH 22/45] fix: update --- packages/universal-app-runtime/src/router.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/universal-app-runtime/src/router.js b/packages/universal-app-runtime/src/router.js index 24db15d650..ef67689e71 100644 --- a/packages/universal-app-runtime/src/router.js +++ b/packages/universal-app-runtime/src/router.js @@ -49,7 +49,7 @@ export function useRouter(routerConfig) { return null; } else { // process Page.getInitialProps - if (currentPath !== _currentPagePath) { + if (_currentPagePath !== _history.location.pathname) { _initialProps = {}; _currentPagePath = _history.location.pathname; // SSR project the first time is initialized from global data, @@ -63,14 +63,15 @@ export function useRouter(routerConfig) { component.getInitialProps().then((props) => { _initialProps = props; setCurrentPath(_currentPagePath); - }, () => { + }).catch(() => { _initialProps = {}; setCurrentPath(_currentPagePath); }); return null; + } else { + setCurrentPath(_currentPagePath); } } - return createElement(component, { ...props, ..._initialProps }); } } From 6a102e29973c4f45a475b7e999e96fccea30c0ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E6=BE=9C?= Date: Sun, 4 Aug 2019 09:41:36 +0800 Subject: [PATCH 23/45] fix: hmr in ssr --- .../rax-plugin-app/src/config/web/getBase.js | 2 +- packages/rax-plugin-ssr/package.json | 4 ++-- .../rax-plugin-ssr/src/ssr/getBaseConfig.js | 15 ++++++++------- .../rax-plugin-ssr/src/ssr/ignoreLoader.js | 6 ++++++ .../rax-plugin-ssr/src/web/setBaseConfig.js | 18 ++++++++++++++++++ 5 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 packages/rax-plugin-ssr/src/ssr/ignoreLoader.js diff --git a/packages/rax-plugin-app/src/config/web/getBase.js b/packages/rax-plugin-app/src/config/web/getBase.js index b6ebe511c6..5528fe7e14 100644 --- a/packages/rax-plugin-app/src/config/web/getBase.js +++ b/packages/rax-plugin-app/src/config/web/getBase.js @@ -96,7 +96,7 @@ module.exports = (rootDir) => { config.plugin('minicss') .use(MiniCssExtractPlugin, [{ filename: 'web/[name].css', - chunkFilename: 'web/[id].css', + chunkFilename: 'web/[name].css', }]); config.plugin('noError') diff --git a/packages/rax-plugin-ssr/package.json b/packages/rax-plugin-ssr/package.json index 7d2ebba727..84b942f41f 100644 --- a/packages/rax-plugin-ssr/package.json +++ b/packages/rax-plugin-ssr/package.json @@ -13,9 +13,9 @@ }, "homepage": "https://github.com/alibaba/rax#readme", "dependencies": { - "webpack": "^4.39.0", "address": "^1.1.0", "rax-plugin-app": "^0.1.0-0", - "rax-ssr-dev-server": "^1.0.0" + "rax-ssr-dev-server": "^1.0.0", + "universal-app-shell-loader": "^0.1.1" } } diff --git a/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js b/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js index 9473617db4..59b39443c7 100644 --- a/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js +++ b/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js @@ -31,14 +31,15 @@ module.exports = (rootDir) => { rax: 'rax', }); - // config.plugins.delete('minicss'); - - // config.plugin('ingnorecss') - // .use(webpack.IgnorePlugin, [{ - // resourceRegExp: /\.css?$/ - // }]); - config.plugins.delete('document'); + config.plugins.delete('minicss'); + config.module.rules.delete('css'); + config.module.rule('css') + .test(/\.css?$/) + .use('ignorecss') + .loader(require.resolve('./ignoreLoader')) + .end(); + return config; }; diff --git a/packages/rax-plugin-ssr/src/ssr/ignoreLoader.js b/packages/rax-plugin-ssr/src/ssr/ignoreLoader.js new file mode 100644 index 0000000000..fa50d0540b --- /dev/null +++ b/packages/rax-plugin-ssr/src/ssr/ignoreLoader.js @@ -0,0 +1,6 @@ +'use strict'; + +module.exports = function(content) { + this.cacheable && this.cacheable(); + return ''; +}; \ No newline at end of file diff --git a/packages/rax-plugin-ssr/src/web/setBaseConfig.js b/packages/rax-plugin-ssr/src/web/setBaseConfig.js index 9b59856a3a..abd0db2b74 100644 --- a/packages/rax-plugin-ssr/src/web/setBaseConfig.js +++ b/packages/rax-plugin-ssr/src/web/setBaseConfig.js @@ -1,5 +1,23 @@ 'use strict'; +const path = require('path'); + +const UNIVERSAL_APP_SHELL_LOADER = require.resolve('universal-app-shell-loader'); module.exports = (config, rootDir) => { + // const appEntry = config.entryPoints.get('index').values(); + + // remove hmrClient + + const appEntry = path.resolve(rootDir, 'src/app.js'); + // remove hmrClient + config.entry('index').clear(); + + // // TODO: + // config.entry('index') + // .add(appEntry[1]); + + config.entry('index') + .add(`${UNIVERSAL_APP_SHELL_LOADER}?type=web!${appEntry}`); + return config; }; From 78ed252507787c64316899063a41c0ffc29179ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E6=BE=9C?= Date: Sun, 4 Aug 2019 10:00:58 +0800 Subject: [PATCH 24/45] fix: hrm in ssr --- packages/rax-plugin-ssr/src/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/rax-plugin-ssr/src/index.js b/packages/rax-plugin-ssr/src/index.js index 5c875215ff..4e5097b3bc 100644 --- a/packages/rax-plugin-ssr/src/index.js +++ b/packages/rax-plugin-ssr/src/index.js @@ -2,11 +2,13 @@ const SSRDevServer = require('rax-ssr-dev-server'); const getSSRBuildConfig = require('./ssr/getBuildConfig'); const getSSRDevConfig = require('./ssr/getDevConfig'); - +const setWebBaseConfig = require('./web/setBaseConfig'); // can‘t clone webpack chain object module.exports = ({ chainWebpack, registerConfig, setDevServer, rootDir, onHook, log }) => { chainWebpack((config, { command }) => { + setWebBaseConfig(config, rootDir); + let ssrConfig; if (command === 'build') { ssrConfig = getSSRBuildConfig(rootDir); From ce13c82cf1d3abb6a46c82f4f38cdacb53395c4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E6=BE=9C?= Date: Sun, 4 Aug 2019 13:10:47 +0800 Subject: [PATCH 25/45] feat: support inline style --- .../rax-plugin-app/src/config/web/getBase.js | 25 +++++++++++++------ packages/rax-plugin-ssr/package.json | 1 + .../rax-plugin-ssr/src/ssr/getBaseConfig.js | 22 ++++++++++++---- packages/rax-plugin-ssr/src/ssr/getEntries.js | 1 + packages/rax-plugin-ssr/src/ssr/loader.js | 6 +++-- 5 files changed, 41 insertions(+), 14 deletions(-) diff --git a/packages/rax-plugin-app/src/config/web/getBase.js b/packages/rax-plugin-app/src/config/web/getBase.js index 5528fe7e14..1bea20caf6 100644 --- a/packages/rax-plugin-app/src/config/web/getBase.js +++ b/packages/rax-plugin-app/src/config/web/getBase.js @@ -1,4 +1,5 @@ 'use strict'; +const path = require('path'); const webpack = require('webpack'); const serverRender = require('rax-server-renderer'); const babelMerge = require('babel-merge'); @@ -46,7 +47,16 @@ module.exports = (rootDir) => { .use('ts') .loader(require.resolve('ts-loader')); - config.module.rule('css') + const buildConfigPath = path.resolve(rootDir, 'build.json'); + const buildConfig = require(buildConfigPath); + + if (buildConfig.inlineStyle) { + config.module.rule('css') + .test(/\.css?$/) + .use('css') + .loader(require.resolve('stylesheet-loader')); + } else { + config.module.rule('css') .test(/\.css?$/) .use('minicss') .loader(MiniCssExtractPlugin.loader) @@ -69,6 +79,13 @@ module.exports = (rootDir) => { ], }); + config.plugin('minicss') + .use(MiniCssExtractPlugin, [{ + filename: 'web/[name].css', + chunkFilename: 'web/[name].css', + }]); + } + config.module.rule('assets') .test(/\.(svg|png|webp|jpe?g|gif)$/i) .use('source') @@ -93,12 +110,6 @@ module.exports = (rootDir) => { render: serverRender.renderToString, }]); - config.plugin('minicss') - .use(MiniCssExtractPlugin, [{ - filename: 'web/[name].css', - chunkFilename: 'web/[name].css', - }]); - config.plugin('noError') .use(webpack.NoEmitOnErrorsPlugin); diff --git a/packages/rax-plugin-ssr/package.json b/packages/rax-plugin-ssr/package.json index 84b942f41f..f6c9332df1 100644 --- a/packages/rax-plugin-ssr/package.json +++ b/packages/rax-plugin-ssr/package.json @@ -16,6 +16,7 @@ "address": "^1.1.0", "rax-plugin-app": "^0.1.0-0", "rax-ssr-dev-server": "^1.0.0", + "stylesheet-loader": "^0.6.5", "universal-app-shell-loader": "^0.1.1" } } diff --git a/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js b/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js index 752210dad5..1e015d4f81 100644 --- a/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js +++ b/packages/rax-plugin-ssr/src/ssr/getBaseConfig.js @@ -1,4 +1,5 @@ 'use strict'; +const path = require('path'); const { getWebBase } = require('rax-plugin-app'); const getEntries = require('./getEntries'); @@ -35,11 +36,22 @@ module.exports = (rootDir) => { config.plugins.delete('minicss'); config.module.rules.delete('css'); - config.module.rule('css') - .test(/\.css?$/) - .use('ignorecss') - .loader(require.resolve('./ignoreLoader')) - .end(); + + const buildConfigPath = path.resolve(rootDir, 'build.json'); + const buildConfig = require(buildConfigPath); + + if (buildConfig.inlineStyle) { + config.module.rule('css') + .test(/\.css?$/) + .use('css') + .loader(require.resolve('stylesheet-loader')); + } else { + config.module.rule('css') + .test(/\.css?$/) + .use('ignorecss') + .loader(require.resolve('./ignoreLoader')) + .end(); + } return config; }; diff --git a/packages/rax-plugin-ssr/src/ssr/getEntries.js b/packages/rax-plugin-ssr/src/ssr/getEntries.js index a2bfeed0a5..5a5414a2bc 100644 --- a/packages/rax-plugin-ssr/src/ssr/getEntries.js +++ b/packages/rax-plugin-ssr/src/ssr/getEntries.js @@ -23,6 +23,7 @@ module.exports = (rootDir) => { const query = { path: route.path, + pageName: entry, absoluteDocumentPath, absoluteShellPath, absoluteAppPath, diff --git a/packages/rax-plugin-ssr/src/ssr/loader.js b/packages/rax-plugin-ssr/src/ssr/loader.js index 5137bba87a..e57623a59c 100644 --- a/packages/rax-plugin-ssr/src/ssr/loader.js +++ b/packages/rax-plugin-ssr/src/ssr/loader.js @@ -10,7 +10,8 @@ module.exports = function(content) { absoluteAppPath, absolutePagePath, absoluteAppJSONPath, - publicPath + publicPath, + pageName } = query; const hasShell = fs.existsSync(absoluteShellPath); @@ -55,7 +56,8 @@ module.exports = function(content) { const documentProps = { initialHtml: initialHtml, initialData: 'window.__initialData__=' + JSON.stringify(initialData), - publicPath: '${publicPath}' + publicPath: '${publicPath}', + pageName: '${pageName}' }; await getInitialProps(Document, ctx); From 7c55ab147dbe8ff4dabc6241b96d8d7b55d582e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B4=E6=BE=9C?= Date: Sun, 4 Aug 2019 13:19:21 +0800 Subject: [PATCH 26/45] refactor: initial data --- .../rax-cli/src/generator/app/src/document/index.jsx | 2 +- packages/rax-plugin-ssr/src/ssr/loader.js | 2 +- packages/universal-app-runtime/src/router.js | 4 ++-- packages/universal-app-shell-loader/src/index.js | 12 ++++++------ 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/rax-cli/src/generator/app/src/document/index.jsx b/packages/rax-cli/src/generator/app/src/document/index.jsx index c6cc5e18f0..49c6a07ad8 100755 --- a/packages/rax-cli/src/generator/app/src/document/index.jsx +++ b/packages/rax-cli/src/generator/app/src/document/index.jsx @@ -21,7 +21,7 @@ function Document(props) {