此系列随时可能断更,毕竟我是解释型源码分析……

  tips:本系列源码版本为3.10.0

  尝试看过Spring的源码,有点烧脑,所以还是重回JS吧!

  在配置完环境变量后,可以通过webpack指令进行打包,需要知道的是,如果当前路径存在webpack.config.js文件,会被默认指定为配置JS文件

  官网原文如下:If a webpack.config.js is present, the webpack command picks it up by default

  也就是说直接执行webpack指令会默认执行webpack webpack.config.js

  也可以通过--config自定义,假设配置文件为config.js,这时就需要执行webpack --config config.js

  第一章来点轻松的,比如说webpack.cmd,首先来一张总的流程图:

  

  批处理文件源码如下:

REM @代表该行指令不会被显示在界面中
REM IF EXIST/ELSE类似于普通编程语言的if/else
REM %开头的相当于一个占位符
@IF EXIST "%~dp0\node.exe" (
REM 执行node.exe 并继续执行webpack ...(参数)
"%~dp0\node.exe" "%~dp0\..\webpack\bin\webpack.js" %*
) ELSE (
REM 延迟执行
@SETLOCAL
REM 变量赋值 返回所有系统认为可执行文件类型 排除.JS
@SET PATHEXT=%PATHEXT:;.JS;=;%
REM 尝试直接执行node webpack ...
node "%~dp0\..\webpack\bin\webpack.js" %*
)

  语言是bat命令,花了1个小时入了个门,大概能懂指令的内容。

  这里比较复杂的一个是占位符%,%0在这里相当于当前绝对路径,%~dp0是对内容的格式化,测试代码如下:

REM E:\1-homework\a.cmd
@echo off
echo %0
echo "%~d0"
echo "%~p0"
echo "%~dp0"
pause

  输出为:

  所以第一段IF EXIST指令判断的是在当前路径是否存在node.exe文件,如果有就执行并调用后面的webpack指令。

  指令行最后的%*代表所有接收的参数,参数来自于指令后面自定义的字符了,测试代码如下:

@echo off
echo the params is: %*
pause

  然后在当前路径打开cmd在执行文件名后面加上1 2 3,输出如下:

  也就是在webpack input1.js input2.js指令中,input1.js与input2.js会当成参数替换掉%*。

  

  下面的两个命令可以自己去查,这里暂时看不到作用。

  如果当前路径不存在node.exe,会尝试直接调用node webpack进行打包操作。

  需要注意的是,这里的node并不是一个简单的cmd脚本,而是一个可执行文件,可以在安装的nodejs文件夹中找到npm.cmd:

:: Created by npm, please don't edit manually.
@ECHO OFF SETLOCAL SET "NODE_EXE=%~dp0\node.exe"
IF NOT EXIST "%NODE_EXE%" (
SET "NODE_EXE=node"
) SET "NPM_CLI_JS=%~dp0\node_modules\npm\bin\npm-cli.js"
FOR /F "delims=" %%F IN ('CALL "%NODE_EXE%" "%NPM_CLI_JS%" prefix -g') DO (
SET "NPM_PREFIX_NPM_CLI_JS=%%F\node_modules\npm\bin\npm-cli.js"
)
IF EXIST "%NPM_PREFIX_NPM_CLI_JS%" (
SET "NPM_CLI_JS=%NPM_PREFIX_NPM_CLI_JS%"
) "%NODE_EXE%" "%NPM_CLI_JS%" %*

  这里需要关注的只有第一个SET语句,将node.exe赋值给node_exe,执行node_exe命令也就相当于执行node.exe文件。

  回到webpack指令中,"%~dp0\..\webpack\bin\webpack.js"的webpack并不是主函数,只是预处理,引入了一个叫yargs的命令行框架,并在里面再次引入真正的webpack,并将配置文件的options传入进行打包,源码简化后如下:

var path = require("path");

try {
var localWebpack = require.resolve(path.join(process.cwd(), "node_modules", "webpack", "bin", "webpack.js"));
if (__filename !== localWebpack) {
return require(localWebpack);
}
} catch (e) {} // 引入yargs框架
var yargs = require("yargs").usage("..."); // ... yargs.options({
// ...
}); yargs.parse(process.argv.slice(2), (err, argv, output) => {
// ...
function processOptions(options) {
// ...
// 引入真正的webpack
var webpack = require("../lib/webpack.js"); Error.stackTraceLimit = 30;
var lastHash = null;
var compiler;
try {
// 将配置文件的options传入进行编译
compiler = webpack(options);
} catch (err) {
// ... throw err;
} // 编译后处理
// ...
}
processOptions(options);
});

  来自于lib文件夹的webpack才是真正的主入口函数。

  这一节内容暂时就到这里,简单过了一下cmd~

.1-浅析webpack源码之webpack.cmd的更多相关文章

  1. .3-浅析webpack源码之预编译总览

    写在前面: 本来一开始想沿用之前vue源码的标题:webpack源码之***,但是这个工具比较巨大,所以为防止有人觉得我装逼跑来喷我(或者随时鸽),加上浅析二字,以示怂. 既然是浅析,那么案例就不必太 ...

  2. 从Webpack源码探究打包流程,萌新也能看懂~

    简介 上一篇讲述了如何理解tapable这个钩子机制,因为这个是webpack程序的灵魂.虽然钩子机制很灵活,而然却变成了我们读懂webpack道路上的阻碍.每当webpack运行起来的时候,我的心态 ...

  3. webpack源码-依赖收集

    webpack源码-依赖收集 version:3.12.0 程序主要流程: 触发make钩子 Compilation.js 执行EntryOptionPlugin 中注册的make钩子 执行compi ...

  4. .30-浅析webpack源码之doResolve事件流(1)

    这里所有的插件都对应着一个小功能,画个图整理下目前流程: 上节是从ParsePlugin中出来,对'./input.js'入口文件的路径做了处理,返回如下: ParsePlugin.prototype ...

  5. .17-浅析webpack源码之compile流程-入口函数run

    本节流程如图: 现在正式进入打包流程,起步方法为run: Compiler.prototype.run = (callback) => { const startTime = Date.now( ...

  6. .34-浅析webpack源码之事件流make(3)

    新年好呀~过个年光打游戏,function都写不顺溜了. 上一节的代码到这里了: // NormalModuleFactory的resolver事件流 this.plugin("resolv ...

  7. .30-浅析webpack源码之doResolve事件流(2)

    这里所有的插件都对应着一个小功能,画个图整理下目前流程: 上节是从ParsePlugin中出来,对'./input.js'入口文件的路径做了处理,返回如下: ParsePlugin.prototype ...

  8. 浅析libuv源码-node事件轮询解析(3)

    好像博客有观众,那每一篇都画个图吧! 本节简图如下. 上一篇其实啥也没讲,不过node本身就是这么复杂,走流程就要走全套.就像曾经看webpack源码,读了300行代码最后就为了取package.js ...

  9. .4-浅析webpack源码之convert-argv模块

    上一节看了一眼预编译的总体代码,这一节分析convert-argv模块. 这个模块主要是对命令参数的解析,也是yargs框架的核心用处. 生成默认配置文件名数组 module.exports = fu ...

随机推荐

  1. 解决UNIGUI字体太小的问题

    解决UNIGUI字体太小的问题 Unigui运行在chrome浏览器下可以有最佳的效果,但用ie打开用unigui做的项目会发现字体明显小一截,可以用自定义css来解决这个问题. 可以在UniServ ...

  2. Redis-HA高可用方案Sentinel配置

    上一节中介绍了master-slave模式,在最小配置:master.slave各一个节点的情况下,不管是master还是slave down掉一个,“完整的”读/写功能都将受影响,这在生产环境中显然 ...

  3. ue4开发入门教程

    ue4是一套开源跨平台的游戏引擎,游戏画质3A水准,具有强大的材质编辑器,各种插件齐全.想要学习ue4的,可以参考这篇文章作为入门. 学习这篇文章,建议具有一定的C++基础,对游戏有一定了解. 1.首 ...

  4. C# winform ListBox实现滚动条自动滚动至底部

    效果如图: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...

  5. 一场关于 .net core 和 .net framework 编码的案情分析

    案情背景 目前公司做新项目,基本所有新项目都是用.net core来做,旧项目一半还是基于 .net framework下面,一半已经迁移到了core平台.在做新项目的时候,有个功能需要对接到旧项目那 ...

  6. CentOS7中配置vsftpd

    1.yum -y install vsftpd  安装vsftpd 2.配置vsftpd的配置文件(/etc/vsftpd/vsftpd.conf)主要修改以下配置内容 #不允许匿名访问 anonym ...

  7. 【文文殿下】[CEOI2004]锯木厂选址 题解

    题解 我们枚举建厂的位置,发现有个\(n^2\)的DP.随手搞个斜率优化到\(O(n)\). #include<bits/stdc++.h> using namespace std; ty ...

  8. SQL注入之PHP-MySQL实现手工注入-数字型

    SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎 ...

  9. IPv6 Can't assign requested address

    今天试了下 bind IPv6 的地址,报错  Can't assign requested address http://stackoverflow.com/questions/24780404/p ...

  10. [Vuejs] webpack+vue-cli打包如何引用相对路径

    默认情况下通过webpack+vuec-li打包的css.js等资源,路径都是绝对的,即static在根目录下,假如部署到带有文件夹目录的项目中,资源路径就会出错,如何解决. 1.修改资源引用相对路径 ...