web123456

vue-element-admin source code interpretation——Project startup process

async function serve (args) { info('Starting development server...') // although this is primarily a dev server, it is possible that we // are running it in a mode with a production env, . in E2E tests. const isInContainer = checkInContainer() const isProduction = process.env.NODE_ENV === 'production' const url = require('url') const chalk = require('chalk') const webpack = require('webpack') const WebpackDevServer = require('webpack-dev-server') const portfinder = require('portfinder') const prepareURLs = require('../util/prepareURLs') const prepareProxy = require('../util/prepareProxy') const launchEditorMiddleware = require('launch-editor-middleware') const validateWebpackConfig = require('../util/validateWebpackConfig') const isAbsoluteUrl = require('../util/isAbsoluteUrl') // Get the webpack configuration, and get it when Service is initialized const webpackConfig = api.resolveWebpackConfig() //Check if there is any problem with the configuration information validateWebpackConfig(webpackConfig, api, options) //Configure webpack's devServer configuration option, this option is obtained from const projectDevServerOptions = Object.assign( webpackConfig.devServer || {}, options.devServer ) ...... // Options to configure server const useHttps = args.https || projectDevServerOptions.https || defaults.https const protocol = useHttps ? 'https' : 'http' const host = args.host || process.env.HOST || projectDevServerOptions.host || defaults.host portfinder.basePort = args.port || process.env.PORT || projectDevServerOptions.port || defaults.port const port = await portfinder.getPortPromise() const rawPublicUrl = args.public || projectDevServerOptions.public const publicUrl = rawPublicUrl ? /^[a-zA-Z]+:\/\//.test(rawPublicUrl) ? rawPublicUrl : `${protocol}://${rawPublicUrl}` : null const urls = prepareURLs( protocol, host, port, isAbsoluteUrl(options.publicPath) ? '/' : options.publicPath ) const proxySettings = prepareProxy( projectDevServerOptions.proxy, api.resolve('public') ) // Configure webpack-dev-server options if (!isProduction) { const sockjsUrl = publicUrl ? `?${publicUrl}/sockjs-node` : isInContainer ? `` : `?` + url.format({ protocol, port, hostname: urls.lanUrlForConfig || 'localhost', pathname: '/sockjs-node' }) const devClients = [ // dev server client require.resolve(`webpack-dev-server/client`) + sockjsUrl, // hmr client require.resolve(projectDevServerOptions.hotOnly ? 'webpack/hot/only-dev-server' : 'webpack/hot/dev-server') // TODO custom overlay client // `@vue/cli-overlay/dist/client` ] if (process.env.APPVEYOR) { devClients.push(`webpack/hot/poll?500`) } // inject dev/hot client addDevClientToEntry(webpackConfig, devClients) } // create compiler const compiler = webpack(webpackConfig) // Create a server and inject configuration information const server = new WebpackDevServer(compiler, Object.assign({ clientLogLevel: 'none', historyApiFallback: { disableDotRule: true, rewrites: genHistoryApiFallbackRewrites(options.publicPath, options.pages) }, //Specify the root directory path contentBase: api.resolve('public'), //Start whether to monitor root directory file changes watchContentBase: !isProduction, //Start hot updates in the development environment hot: !isProduction, quiet: true, compress: isProduction, publicPath: options.publicPath, overlay: isProduction // TODO disable this ? false : { warnings: false, errors: true } }, projectDevServerOptions, { https: useHttps, proxy: proxySettings, before (app, server) { // launch editor support. // this works with vue-devtools & @vue/cli-overlay app.use('/__open-in-editor', launchEditorMiddleware(() => console.log( `To specify an editor, sepcify the EDITOR env variable or ` + `add "editor" field to your Vue project config.\n` ))) //Specify the plugin configured api.service.devServerConfigFns.forEach(fn => fn(app, server)) //The middleware configured in the application project, the mock server specified in the specified in the application project is executed here projectDevServerOptions.before && projectDevServerOptions.before(app, server) } })) // Monitor system signals ;['SIGINT', 'SIGTERM'].forEach(signal => { process.on(signal, () => { server.close(() => { process.exit(0) }) }) }) // Listen to the shutdown signal if (process.env.VUE_CLI_TEST) { process.stdin.on('data', data => { if (data.toString() === 'close') { console.log('got close signal!') server.close(() => { process.exit(0) }) } }) }