webpack源码分析——参数初始化

webpack比较常见的用法有两种:一、使用配置文件;二、不使用配置文件(用命令 webpack <entry> [<entry>] <output>)。这两种方式参数的初始化方式不太一样:

方式一、从配置文件和shell语句中读取并合并参数;方式二、从shell语句从直接读取入口和出口参数。本文会结合源码,分析一下这两种方式的实现。(文章使用的webpack版本是3.10.0)

webpack执行的入口文件是bin目录下面的webpack.js,负责参数转换处理的文件是bin目录下面的convert-argv.js。下面来简单介绍一下这两个文件的作用。

入口文件webpack.js

入口文件的大概作用是:通过convert-argv.js进行参数初始化处理,webpack.js文件获取处理的参数后,传递给lib目录下的webpack.js文件获取编译对象complier,而后complier调用run方法成功后,将编译后的信息打印到屏幕上。入口文件webpack.js大致实现原理如下(伪代码仅用于说明并不能实际运行):

 参数转换convert-argv.js

webpack对参数的转换处理都在这个文件中进行,过程稍微麻烦一些,我们用流程图的方式进行介绍。

1、webpack首先会指定一个默认配置文件数组defaultConfigFiles,这个数据结构里面存储的是文件名称和扩展名的对象,例如:

{path: e:/demo/webpack.config.js, ext: js}或者{path: e:/demo/webpack.config.js, ext: java}

2、程序判断一下,用户有没有通过命令行指定其他名称的配置文件。webpack支持用户使用以下的命令:

webpack --config example.config.js

3、用户通过config命令指定的文件或者是从默认配置数组中读取的信息都会保存在configFiles数组中,数组中保存的对象的格式也是

{path: e:/demo/webpack.config.js, ext: js}

4、通过configFiles数组的长度,程序判断用户是否使用配置文件配置webpack。数组长度为零,说明用户没有使用配置文件,entry和output信息需要从命令行中读取;如果长度不为零,那么信息需要从配置文件和shell语句从进行读取与合并,这时候程序会通过require的方式加载配置文件,读取配置的对象或者数组。

5、使用processConfiguredOptions方法处理options,传入的options参数大致有三种形式:一、空对象;二、普通对象;三、数组对象。

如果是空对象,说明是使用webpack <entry> [<entry>] <output>方式,这种方式,需要从argv._中获取entry和output信息;

如果是普通对象,将普通对象和shell语句中传入的参数进行合并处理

如果是数字对象,需遍历每个普通对象,进入普通对象的处理流程

处理完后,返回一个options对象或者options数组。

原文地址:https://www.cnblogs.com/xiaokebb/p/8472766.html

时间: 2024-07-30 16:45:27

webpack源码分析——参数初始化的相关文章

MyBatis源码分析-MyBatis初始化流程

MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.如何新建MyBatis源码工程请点击MyBatis源码分析-IDEA新建MyBatis源码工程. MyBatis初始化的过程也就是创建Configura

Solr初始化源码分析-Solr初始化与启动

用solr做项目已经有一年有余,但都是使用层面,只是利用solr现有机制,修改参数,然后监控调优,从没有对solr进行源码级别的研究.但是,最近手头的一个项目,让我感觉必须把solrn内部原理和扩展机制弄熟,才能把这个项目做好.今天分享的就是:Solr是如何启动并且初始化的.大家知道,部署solr时,分两部分:一.solr的配置文件.二.solr相关的程序.插件.依赖lucene相关的jar包.日志方面的jar.因此,在研究solr也可以顺着这个思路:加载配置文件.初始化各个core.初始化各个

webpack源码分析——配置调试环境

无论是阅读webpack源码,还是编写webpack的plugin和loader,配置调试环境都是很有必要的.weabpack的运行环境是nodejs,调试webpack就是调试nodejs程序.我们平时使用的IDE如eclipse.webstorm都支持nodejs的调试.本文以eclipse(Version: Oxygen.1a Release (4.7.1a))为例,进行讲解. 在这个例子里面,我们使用webpack <entry> [<entry>] <output&

linux内存源码分析 - 伙伴系统(初始化和申请页框)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前的文章已经介绍了伙伴系统,这篇我们主要看看源码中是如何初始化伙伴系统.从伙伴系统中分配页框,返回页框于伙伴系统中的. 我们知道,每个管理区都有自己的伙伴系统管理属于这个管理区的页框,这也说明了,在伙伴系统初始化时,管理区必须要已经存在(初始化完成)了.在管理区描述符(struct zone)中,struct free_area就专门用于描述伙伴系统的.在一个管理区中,伙伴系统一共维护着包含1,2,4,8,

mediastream2源码分析-1 初始化

mscommon.c: void ms_init(){ …. /* register builtin MSFilter's */ //注册所有内置filter for (i=0;ms_filter_descs[i]!=NULL;i++){ ms_filter_register(ms_filter_descs[i]); }... ******************************** alldesc.h其中ms_filter_descs如下: 数组中filter的desc没有顺序之分 M

linux内存源码分析 - 内存回收(整体流程)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 当linux系统内存压力就大时,就会对系统的每个压力大的zone进程内存回收,内存回收主要是针对匿名页和文件页进行的.对于匿名页,内存回收过程中会筛选出一些不经常使用的匿名页,将它们写入到swap分区中,然后作为空闲页框释放到伙伴系统.而对于文件页,内存回收过程中也会筛选出一些不经常使用的文件页,如果此文件页中保存的内容与磁盘中文件对应内容一致,说明此文件页是一个干净的文件页,就不需要进行回写,直接将此

(转)linux内存源码分析 - 内存回收(整体流程)

http://www.cnblogs.com/tolimit/p/5435068.html------------linux内存源码分析 - 内存回收(整体流程) 概述 当linux系统内存压力就大时,就会对系统的每个压力大的zone进程内存回收,内存回收主要是针对匿名页和文件页进行的.对于匿名页,内存回收过程中会筛选出一些不经常使用的匿名页,将它们写入到swap分区中,然后作为空闲页框释放到伙伴系统.而对于文件页,内存回收过程中也会筛选出一些不经常使用的文件页,如果此文件页中保存的内容与磁盘中

Vue.js 源码分析(十) ref属性详解

用法 ref 被用来给元素或子组件注册引用信息.引用信息将会注册在父组件的 $refs 对象上.如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素:如果用在子组件上,引用就指向组件实例,例如: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <scrip

ConcurrentHashMap源码分析(JDK1.7和1.8对比)

一.ConcurrentHashMap简介 并发编程大师Doug Lea开发的并发容器之一.ConcurrentHashMap是线程安全且高效的HashMap,在HashMap的基础上增加了线程安全,当然结构方面也有所改变. 为什么要使用ConcurrentHashMap? 1.多线程环境下,HashMap会处于不安全状态.例如put操作可能会引起程序死循环,Cpu占有率达百分百,原因是多线程会导致HashMap的Entry链表形成环形数据结构,如此一来,他的next结点将永不为空,就会产生死循