You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							167 lines
						
					
					
						
							4.6 KiB
						
					
					
				
			
		
		
	
	
							167 lines
						
					
					
						
							4.6 KiB
						
					
					
				#!/usr/bin/env node | 
						|
 | 
						|
'use strict'; | 
						|
 | 
						|
/* eslint-disable no-shadow, no-console */ | 
						|
 | 
						|
const fs = require('fs'); | 
						|
const net = require('net'); | 
						|
const debug = require('debug')('webpack-dev-server'); | 
						|
const importLocal = require('import-local'); | 
						|
const yargs = require('yargs'); | 
						|
const webpack = require('webpack'); | 
						|
const Server = require('../lib/Server'); | 
						|
const setupExitSignals = require('../lib/utils/setupExitSignals'); | 
						|
const colors = require('../lib/utils/colors'); | 
						|
const processOptions = require('../lib/utils/processOptions'); | 
						|
const createLogger = require('../lib/utils/createLogger'); | 
						|
const getVersions = require('../lib/utils/getVersions'); | 
						|
const options = require('./options'); | 
						|
 | 
						|
let server; | 
						|
const serverData = { | 
						|
  server: null, | 
						|
}; | 
						|
// we must pass an object that contains the server object as a property so that | 
						|
// we can update this server property later, and setupExitSignals will be able to | 
						|
// recognize that the server has been instantiated, because we will set | 
						|
// serverData.server to the new server object. | 
						|
setupExitSignals(serverData); | 
						|
 | 
						|
// Prefer the local installation of webpack-dev-server | 
						|
if (importLocal(__filename)) { | 
						|
  debug('Using local install of webpack-dev-server'); | 
						|
 | 
						|
  return; | 
						|
} | 
						|
 | 
						|
try { | 
						|
  require.resolve('webpack-cli'); | 
						|
} catch (err) { | 
						|
  console.error('The CLI moved into a separate package: webpack-cli'); | 
						|
  console.error( | 
						|
    "Please install 'webpack-cli' in addition to webpack itself to use the CLI" | 
						|
  ); | 
						|
  console.error('-> When using npm: npm i -D webpack-cli'); | 
						|
  console.error('-> When using yarn: yarn add -D webpack-cli'); | 
						|
 | 
						|
  process.exitCode = 1; | 
						|
} | 
						|
 | 
						|
yargs.usage( | 
						|
  `${getVersions()}\nUsage:  https://webpack.js.org/configuration/dev-server/` | 
						|
); | 
						|
 | 
						|
// webpack-cli@3.3 path : 'webpack-cli/bin/config/config-yargs' | 
						|
let configYargsPath; | 
						|
try { | 
						|
  require.resolve('webpack-cli/bin/config/config-yargs'); | 
						|
  configYargsPath = 'webpack-cli/bin/config/config-yargs'; | 
						|
} catch (e) { | 
						|
  configYargsPath = 'webpack-cli/bin/config-yargs'; | 
						|
} | 
						|
// eslint-disable-next-line import/no-extraneous-dependencies | 
						|
// eslint-disable-next-line import/no-dynamic-require | 
						|
require(configYargsPath)(yargs); | 
						|
 | 
						|
// It is important that this is done after the webpack yargs config, | 
						|
// so it overrides webpack's version info. | 
						|
yargs.version(getVersions()); | 
						|
yargs.options(options); | 
						|
 | 
						|
const argv = yargs.argv; | 
						|
 | 
						|
// webpack-cli@3.3 path : 'webpack-cli/bin/utils/convert-argv' | 
						|
let convertArgvPath; | 
						|
try { | 
						|
  require.resolve('webpack-cli/bin/utils/convert-argv'); | 
						|
  convertArgvPath = 'webpack-cli/bin/utils/convert-argv'; | 
						|
} catch (e) { | 
						|
  convertArgvPath = 'webpack-cli/bin/convert-argv'; | 
						|
} | 
						|
// eslint-disable-next-line import/no-extraneous-dependencies | 
						|
// eslint-disable-next-line import/no-dynamic-require | 
						|
const config = require(convertArgvPath)(yargs, argv, { | 
						|
  outputFilename: '/bundle.js', | 
						|
}); | 
						|
 | 
						|
function startDevServer(config, options) { | 
						|
  const log = createLogger(options); | 
						|
 | 
						|
  let compiler; | 
						|
 | 
						|
  try { | 
						|
    compiler = webpack(config); | 
						|
  } catch (err) { | 
						|
    if (err instanceof webpack.WebpackOptionsValidationError) { | 
						|
      log.error(colors.error(options.stats.colors, err.message)); | 
						|
      // eslint-disable-next-line no-process-exit | 
						|
      process.exit(1); | 
						|
    } | 
						|
 | 
						|
    throw err; | 
						|
  } | 
						|
 | 
						|
  try { | 
						|
    server = new Server(compiler, options, log); | 
						|
    serverData.server = server; | 
						|
  } catch (err) { | 
						|
    if (err.name === 'ValidationError') { | 
						|
      log.error(colors.error(options.stats.colors, err.message)); | 
						|
      // eslint-disable-next-line no-process-exit | 
						|
      process.exit(1); | 
						|
    } | 
						|
 | 
						|
    throw err; | 
						|
  } | 
						|
 | 
						|
  if (options.socket) { | 
						|
    server.listeningApp.on('error', (e) => { | 
						|
      if (e.code === 'EADDRINUSE') { | 
						|
        const clientSocket = new net.Socket(); | 
						|
 | 
						|
        clientSocket.on('error', (err) => { | 
						|
          if (err.code === 'ECONNREFUSED') { | 
						|
            // No other server listening on this socket so it can be safely removed | 
						|
            fs.unlinkSync(options.socket); | 
						|
 | 
						|
            server.listen(options.socket, options.host, (error) => { | 
						|
              if (error) { | 
						|
                throw error; | 
						|
              } | 
						|
            }); | 
						|
          } | 
						|
        }); | 
						|
 | 
						|
        clientSocket.connect({ path: options.socket }, () => { | 
						|
          throw new Error('This socket is already used'); | 
						|
        }); | 
						|
      } | 
						|
    }); | 
						|
 | 
						|
    server.listen(options.socket, options.host, (err) => { | 
						|
      if (err) { | 
						|
        throw err; | 
						|
      } | 
						|
 | 
						|
      // chmod 666 (rw rw rw) | 
						|
      const READ_WRITE = 438; | 
						|
 | 
						|
      fs.chmod(options.socket, READ_WRITE, (err) => { | 
						|
        if (err) { | 
						|
          throw err; | 
						|
        } | 
						|
      }); | 
						|
    }); | 
						|
  } else { | 
						|
    server.listen(options.port, options.host, (err) => { | 
						|
      if (err) { | 
						|
        throw err; | 
						|
      } | 
						|
    }); | 
						|
  } | 
						|
} | 
						|
 | 
						|
processOptions(config, argv, (config, options) => { | 
						|
  startDevServer(config, options); | 
						|
});
 | 
						|
 |