UNPKG

ssr

Version:

cli for react/vue2/vue3 ssr deploy on serverless or tradtional web server

221 lines 7.91 kB
#!/usr/bin/env node "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.deployFunc = exports.buildFunc = exports.startFunc = void 0; const child_process_1 = require("child_process"); const path_1 = require("path"); const yargs = require("yargs"); const html_1 = require("./html"); const preprocess_1 = require("./preprocess"); const ssg_1 = require("./ssg"); const watcher_1 = require("./watcher"); const add_chunk_name_1 = require("./add-chunk-name"); const spinnerProcess = (0, child_process_1.fork)((0, path_1.resolve)(__dirname, './spinner')); // 单独创建子进程跑 spinner 否则会被后续的 同步代码 block 导致 loading 暂停 const spinner = { start: () => spinnerProcess.send({ message: 'start' }), stop: () => spinnerProcess.send({ message: 'stop' }) }; const startOrBuild = async (argv, type) => { var _a, _b; const { judgeFramework, judgeServerFramework, logGreen, getCwd } = await Promise.resolve().then(() => require('ssr-common-utils')); const cwd = getCwd(); const framework = judgeFramework(); const serverFramework = judgeServerFramework(); if (argv.ssg) { logGreen('Using ssg for generate static html file'); } if (!argv.api) { const { clientPlugin } = await Promise.resolve(`${(0, path_1.resolve)(cwd, './node_modules', framework)}`).then(s => require(s)); const client = clientPlugin(); await ((_a = client === null || client === void 0 ? void 0 : client[type]) === null || _a === void 0 ? void 0 : _a.call(client, argv)); } if (!argv.web) { const { serverPlugin } = await Promise.resolve(`${(0, path_1.resolve)(cwd, './node_modules', serverFramework)}`).then(s => require(s)); const server = serverPlugin(); await ((_b = server === null || server === void 0 ? void 0 : server[type]) === null || _b === void 0 ? void 0 : _b.call(server, argv)); } if (type === 'build') { await (0, html_1.generateHtml)(); await (0, ssg_1.ssg)(argv); } }; const startFunc = async (argv) => { await (0, preprocess_1.handleEnv)(argv); if (argv.tool !== 'vite') { spinner.start(); } process.env.NODE_ENV = 'development'; const { parseFeRoutes, transformConfig, logInfo } = await Promise.resolve().then(() => require('ssr-common-utils')); await transformConfig(); if (argv.tool === 'vite') { logInfo('Vite 场景本地开发样式闪烁为正常现象请忽略,生产环境无此问题'); } const watcher = await (0, watcher_1.createWatcher)(); await parseFeRoutes(); await (0, add_chunk_name_1.addChunkNameInRoutes)(); spinner.stop(); await startOrBuild(argv, 'start'); await (0, watcher_1.onWatcher)(watcher); }; exports.startFunc = startFunc; const buildFunc = async (argv) => { await (0, preprocess_1.handleEnv)(argv); spinner.start(); process.env.NODE_ENV = 'production'; const { parseFeRoutes, transformConfig } = await Promise.resolve().then(() => require('ssr-common-utils')); await transformConfig(); await parseFeRoutes(); await (0, add_chunk_name_1.addChunkNameInRoutes)(); spinner.stop(); await startOrBuild(argv, 'build'); }; exports.buildFunc = buildFunc; const deployFunc = async (argv) => { var _a; process.env.NODE_ENV = 'production'; const { judgeServerFramework } = await Promise.resolve().then(() => require('ssr-common-utils')); const serverFramework = judgeServerFramework(); const { serverPlugin } = await Promise.resolve(`${serverFramework}`).then(s => require(s)); const server = serverPlugin(); if (!(server === null || server === void 0 ? void 0 : server.deploy)) { console.log('当前插件不支持 deploy 功能,请使用 ssr-plugin-midway 插件 参考 https://www.yuque.com/midwayjs/faas/migrate_egg 或扫码进群了解'); return; } await ((_a = server === null || server === void 0 ? void 0 : server.deploy) === null || _a === void 0 ? void 0 : _a.call(server, argv)); spinner.stop(); }; exports.deployFunc = deployFunc; const cliDesc = { web: { desc: 'only start client plugin' }, api: { desc: 'only start server plugin' } }; yargs .command('start', 'Start Server', (yargs) => yargs.options({ bundleConfig: { alias: 'bc', desc: 'bundle config.ts dependencies module by esbuild' }, analyze: { alias: 'a', desc: 'Analyze bundle result when using webpack for build' }, tool: { desc: 'Start application by vite or rspack', choices: ['webpack', 'vite', 'rspack'], default: 'webpack' }, viteMode: { desc: 'same like vite start --mode' }, port: { desc: 'Setting application server port, default is 3000' }, help: { alias: 'h', desc: 'In midway, use --help to speed up ts compile' }, nominify: { desc: 'Disable minify output file content for debug' }, sourcemap: { desc: 'Set type of generate sourcemap by ssr start --sourcemap xxx' }, 'client-sourcemap': { desc: 'Set type of generate sourcemap for client-side code' }, 'server-sourcemap': { desc: 'Set type of generate sourcemap for server-side code' }, ...cliDesc }), async (argv) => { if (argv.bc) { process.env.BUNDLECONFIG = '1'; } await startFunc(argv); }) .command('build', 'Build application by webpack or vite', (yargs) => yargs.options({ bundleConfig: { alias: 'bc', desc: 'bundle config.ts dependencies module by esbuild' }, analyze: { alias: 'a', desc: 'Analyze bundle result when using webpack for build' }, vite: { desc: 'Build application by vite' }, viteMode: { desc: 'same like vite build --mode' }, legacy: { desc: 'Close default rollup manulChunks setting in vite mode' }, html: { desc: 'Build application as a single html' }, ssg: { desc: 'Build with Static Site Generation (Pre Render)' }, sourcemap: { desc: 'Set type of generate sourcemap by build --sourcemap xxx' }, 'client-sourcemap': { desc: 'Set type of generate sourcemap for client-side code' }, 'server-sourcemap': { desc: 'Set type of generate sourcemap for server-side code' }, nominify: { desc: 'Disable minify output file content for debug' }, ...cliDesc }), async (argv) => { const { logWarning } = await Promise.resolve().then(() => require('ssr-common-utils')); if (argv.tool === 'vite') { logWarning(`ssr build by vite is beta now, if you find some bugs, please submit an issue on https://github.com/zhangyuang/ssr/issues or you can use ssr build --tools vite --legacy which will close manualChunks to get a stable bundle result but maybe some performance loss `); } if (argv.bc) { process.env.BUNDLECONFIG = '1'; } await buildFunc(argv); }) .command('deploy', 'Deploy function to aliyun cloud or tencent cloud', (yargs) => yargs.options({ tencent: { desc: 'deploy application to tencent clound' } }), async (argv) => { await deployFunc(argv); }) .command('update', 'check dependencies version is latest', {}, async (_argv) => { spinner.start(); const { update } = await Promise.resolve().then(() => require('./update')); await update(); spinner.stop(); }) .demandCommand(1, 'You need at least one command before moving on') .option('version', { alias: 'v', default: false, desc: 'Show current version' }) .fail((msg, err) => { if (err) { console.log(err); spinner.stop(); process.exit(1); } console.log(msg); }) .parse(); //# sourceMappingURL=cli.js.map