流程梳理

在开始之前我们先对于整个打包流程进行一次梳理。
这里仅仅是一个全流程的梳理,现在你没有必要非常详细的去思考每一个步骤发生了什么,我们会在接下来的步骤中去一步一步带你串联它们。

整体我们将会从上边5个方面来分析Webpack打包流程:

  1. 初始化参数阶段。
    这一步会从我们配置的webpack.config.js中读取到对应的配置参数和shell命令中传入的参数进行合并得到最终打包配置参数。

  2. 开始编译准备阶段
    这一步我们会通过调用webpack()方法返回一个compiler方法,创建我们的compiler对象,并且注册各个Webpack Plugin。找到配置入口中的entry代码,调用compiler.run()方法进行编译。

  3. 模块编译阶段
    从入口模块进行分析,调用匹配文件的loaders对文件进行处理。同时分析模块依赖的模块,递归进行模块编译工作。

  4. 完成编译阶段
    在递归完成后,每个引用模块通过loaders处理完成同时得到模块之间的相互依赖关系。

  5. 输出文件阶段
    整理模块依赖关系,同时将处理后的文件输出到ouput的磁盘目录中。

接下来让我们详细的去探索每一步究竟发生了什么。

创建目录

工欲善其事,必先利其器。首先让我们创建一个良好的目录来管理我们需要实现的Packing tool吧!

让我们来创建这样一个目录:

  • webpack/core存放我们自己将要实现的webpack核心代码。
  • webpack/example存放我们将用来打包的实例项目。
  • webpack/example/webpak.config.js配置文件.
  • webpack/example/src/entry1第一个入口文件
  • webpack/example/src/entry1第二个入口文件
  • webpack/example/src/index.js模块文件
  • webpack/loaders存放我们的自定义loader。
  • webpack/plugins存放我们的自定义plugin。

初始化参数阶段

通常,我们在使用调用webpack命令时,有时会传入一定命令行参数,比如:

webpack --mode=production
# 调用webpack命令执行打包 同时传入mode为production
复制代码

webpack.config.js传递参数
另一种方式,我相信就更加老生常谈了。

我们在项目根目录下使用webpack.config.js导出一个对象进行webpack配置:

const path = require('path')// 引入loader和plugin ...
module.exports = {mode: 'development',entry: {main: path.resolve(__dirname, './src/entry1.js'),second: path.resolve(__dirname, './src/entry2.js'),},devtool: false,// 基础目录,绝对路径,用于从配置中解析入口点(entry point)和 加载器(loader)。// 换而言之entry和loader的所有相对路径都是相对于这个路径而言的context: process.cwd(),output: {path: path.resolve(__dirname, './build'),filename: '[name].js',},plugins: [new PluginA(), new PluginB()],resolve: {extensions: ['.js', '.ts'],},module: {rules: [{test: /\.js/,use: [// 使用自己loader有三种方式 这里仅仅是一种path.resolve(__dirname, '../loaders/loader-1.js'),path.resolve(__dirname, '../loaders/loader-2.js'),],},],},
};

同时这份配置文件也是我们需要作为实例项目example下的实例配置,接下来让我们修改example/webpack.config.js中的内容为上述配置吧。

当然这里的loader和plugin目前你可以不用理解,接下来我们会逐步实现这些东西并且添加到我们的打包流程中去。

实现合并参数阶段

这一步,让我们真正开始动手实现我们的webpack吧!

首先让我们在webpack/core下新建一个index.js文件作为核心入口文件。

同时建立一个webpack/core下新建一个webpack.js文件作为webpack()方法的实现文件。

首先,我们清楚在NodeJs Api中是通过webpack()方法去得到compiler对象的。


此时让我们按照原本的webpack接口格式来补充一下index.js中的逻辑:

  • 我们需要一个webpack方法去执行调用命令。
  • 同时我们引入webpack.config.js配置文件传入webpack方法
// index.js
const webpack = require('./webpack');
const config = require('../example/webpack.config');
// 步骤1: 初始化参数 根据配置文件和shell参数合成参数
const compiler = webpack(config);

嗯,看起来还不错。接下来让我们去实现一下webpack.js:

function webpack(options) {// 合并参数 得到合并后的参数 mergeOptionsconst mergeOptions = _mergeOptions(options);
}// 合并参数
function _mergeOptions(options) {const shellOptions = process.argv.slice(2).reduce((option, argv) => {// argv -> --mode=productionconst [key, value] = argv.split('=');if (key && value) {const parseKey = key.slice(2);option[parseKey] = value;}return option;}, {});return { ...options, ...shellOptions };
}module.export = webpack;

这里我们需要额外说明的是

webpack文件中需要导出一个名为webpack的方法,同时接受外部传入的配置对象。这个是我们在上述讲述过的。

当然关于我们合并参数的逻辑,是将外部传入的对象和执行shell时的传入参数进行最终合并。

在Node Js中我们可以通过process.argv.slice(2)来获得shell命令中传入的参数,比如:

当然_mergeOptions方法就是一个简单的合并配置参数的方法,相信对于大家来说就是小菜一碟。

恭喜大家

webpack 打包流程相关推荐

  1. webpack打包流程_了不起的 Webpack 构建流程学习指南

    最近原创文章回顾: <了不起的 tsconfig.json 指南> <了不起的 Webpack HMR 学习指南(含源码分析)> <<你不知道的 Blob>番 ...

  2. Webpack打包流程系列一:打包JS(JavaScript)文件

    前情提示 webpack是什么? 简单而言,webpack是一个模块打包器.它的主要目标是将JavaScript文件打包在一起,打包后的文件用于在浏览器中使用. 使用webpack的目的 当前端项目的 ...

  3. webpack打包流程

    webpack :是一个用于现代 JavaScript 应用程序的 静态模块打包工具.当 webpack 处理应用程序时,它会在内部从一个或多个入口点构建一个 依赖图(dependency graph ...

  4. webpack 打包流程(初学)

    1)安装webpack-cli npm install webpack-cli -g webpack -v 安装成功,查看版本号 2)新建webpack.config.js文件 module.expo ...

  5. webpack打包 - webpack篇

    @TOC# 什么是 webpack? 本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地 ...

  6. webpack打包css

    webpack打包 1.打包css 2.打包逻辑 1-1.webpack打包css逻辑 3.打包css 4.打包成独立的css文件 5.添加样式前缀 6.格式校验 7.压缩css 8.我们为什么要用这 ...

  7. Webpack打包-打包详细流程

    Webpack  Webpack是一个现代化的静态模块打包器,支持JavaScript.CSS.图片等资源的打包.它将所有模块及其依赖项视为静态资源,并创建一个依赖关系图,将这些资源转换为有效的输出文 ...

  8. webpack打包全流程

    一. webpack 五个核心概念 1.1 Entry 入口(Entry) 指示 webpack 以哪个文件为入口起点开始打包,分析构建内部依赖图. 1.2 Output 输出(Output) 指示 ...

  9. webpack的打包流程是什么?

    1.初始化一个管理包 yarn init 2 .安装使用webpack所需要的依赖包 yarn add webpack webpack-cli -D 3. 在package.json文件中配置scri ...

最新文章

  1. Android实时获取音量(单位:分贝)
  2. 2021年人工智能数据采集标注行业四大趋势预测
  3. Ubuntu 14.04环境变量修改
  4. hyperledge工具-cryptogen
  5. matlab的离散求导,高手留步:MATLAB五阶拟合函数,求导后离散化,输出结果是星号...
  6. 数据中台 VS 传统大数据平台,这 8 点区别要了解
  7. ASP.NET中对STA COM组件的不正确调用产生的w3wp远程DoS
  8. 小鹏汽车提交赴美IPO:上半年营收1.42亿美元 何小鹏持股31.6%为最大股东
  9. 互联网搜索的哪些环节 机器学习_什么是机器学习?有哪些分类?到底有什么用?终于有人讲明白了...
  10. [转载] python之flask框架
  11. 阿里巴巴Java开发手册(详尽PDF版).
  12. Android之使用通知栏通知的三种方法(短内容、长内容、图片通知)
  13. 【云驻共创】华为云数据库之大数据入门与应用(上)
  14. 怎么把PPT转成EXE格式,详细步骤
  15. Request method ‘GET‘ not supported 405错误辨析总结
  16. 乘S10热销的东风,三星四机齐出再攻中国手机市场
  17. 【电子学会】2020年12月图形化一级 -- 海底世界
  18. 【JVM】初学JVM
  19. 基于实践的LabVIEW零基础入门视频教程
  20. MATLAB画三维动态魔方/旋转魔方/旋转立方体

热门文章

  1. 哪款电竞蓝牙耳机好一点?电竞无线蓝牙耳机推荐
  2. ONNXImporter::handleNode DNN/ONNX和create layer “onnx::Gather_384“ of type “NonMaxSuppression“报错解决
  3. 第十一届蓝桥杯 ——限高杆
  4. Tuesday 5th January 2010
  5. Unity 使用DragonBones龙骨插件教程
  6. MySQL查询一周前/三个月前/一年前,及昨天、今天、明天、前一个小时和后一个小时的时间
  7. CSS清除浮动的四种常用方法及其优缺点
  8. 【LOJ#10131】暗的锁链
  9. 【捷哥浅谈PHP】第十八弹---NoSQL数据库Redis之莫问剑(String类型)的修炼
  10. 两个Python小游戏