执行webpack发生了什么

Posted 前端精髓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了执行webpack发生了什么相关的知识,希望对你有一定的参考价值。

本文主要介绍 webpack 和 webpack-cli 模块的关系和部分源码分析。

webpack4.0 以后,似乎执行方式就发生了改变,不再是 webpack 一波流,而是多了一个 webpack-cli。webpack3 中 webpack-cli 是合在 webpack 中。所以在命令行运行 webpack 命令的同时,会提示让你再装一个 webpack-cli。

执行脚本到打包结束流程

1、当我们安装了webpack 模块后,就会在 node_modules/.bin 目录下生成一个 webpack。

图片

在本地环境下,可执行文件放在 node_modules 下的 .bin 文件夹中,npm 为 scripts 字段中的脚本路径自动添加了 node_modules/.bin 前缀,所以可以直接写。

"scripts": 
  "start": "webpack"

而不是

"scripts": 
  "start": "node_modules/.bin webpack"

2、执行 node_modules/.bin/webpack 首先会判断是否安装了 webpack-cli 模块,如果没有安装 webpack-cli 模块就会引导用户去安装,如果已经安装了 webpack-cli 模块,就会去执行 node_modules/webpack-cli/bin/cli 文件。

const runCli = cli => 
	const path = require("path");
	const pkgPath = require.resolve(`$cli.package/package.json`);
	// eslint-disable-next-line node/no-missing-require
	const pkg = require(pkgPath);
	// eslint-disable-next-line node/no-missing-require
	require(path.resolve(path.dirname(pkgPath), pkg.bin[cli.binName]));
;
// node_modules/webpack-cli/bin/cli 
const runCLI = require('../lib/bootstrap');
runCLI(process.argv, originalModuleCompile);

node_modules/webpack-cli/bin/cli 使用了 node_modules/webpack-cli/lib/bootstrap

// node_modules/webpack-cli/lib/bootstrap
const WebpackCLI = require('./webpack-cli');
const runCLI = async (args, originalModuleCompile) => 
    try 
        // Create a new instance of the CLI object
        const cli = new WebpackCLI();

        cli._originalModuleCompile = originalModuleCompile;

        await cli.run(args);
     catch (error) 
        utils.logger.error(error);
        process.exit(2);
    
;

然后 node_modules/webpack-cli/lib/webpack-cli 会导入 webpack,使用 node_modules/webpack/lib/index 模块,在此模块中会真正创建 compiler 编译对象。

// node_modules/webpack-cli/lib/webpack-cli
class WebpackCLI 
  constructor() 
      this.webpack = require('webpack');
  
  async createCompiler(options, callback) 
    let compiler;
    try 
        compiler = this.webpack(
            config.options,
        );
     catch (error) 
        if (this.isValidationError(error)) 
            this.logger.error(error.message);
         else 
            this.logger.error(error);
        

        process.exit(2);
    
    return compiler;
  

执行 node_modules/webpack/lib/index 文件,会再执行 node_modules/webpack/lib/weback 模块。

然后会调用 node_modules/webpack/lib/Compiler 得到一个 Compiler 函数,运行 Compiler 函数,返回一个 compiler 对象,执行 compiler 中的 run 方法,开始编译。

// node_modules/webpack/lib/weback
const Compiler = require("./Compiler");
const compiler = new Compiler(options.context);
compiler.run((err, stats) => 
    compiler.close(err2 => 
        callback(err || err2, stats);
    );
);

以上是关于执行webpack发生了什么的主要内容,如果未能解决你的问题,请参考以下文章

[webpack]源码解读:命令行输入webpack的时候都发生了什么?

使用 Lame 将混合波流转换为 mp3

当执行 import vue from 'vue' 时发生了什么?

webpack常见面试题

vue-webpack-boilerplate分析

当执行 import vue from 'vue' 时发生了啥?