[Vue CLI 3] vue inspect 的源码设计实现

首先,请记住:

它在新版本的脚手架项目里面非常重要

它有什么用呢?

inspect internal webpack config

能快速地在控制台看到对应生成的 webpack 配置对象。

首先它是 vue 的一个扩展命令,在文件 @vue/cli/bin/vue.js 中定义了 command

还是依赖了工具包 commander


const program = require(‘commander‘)

代码配置如下:


program
  .command(‘inspect [paths...]‘)
  .description(‘inspect the webpack config in a project with vue-cli-service‘)
  .option(‘--mode <mode>‘)
  .option(‘--rule <ruleName>‘, ‘inspect a specific module rule‘)
  .option(‘--plugin <pluginName>‘, ‘inspect a specific plugin‘)
  .option(‘--rules‘, ‘list all module rule names‘)
  .option(‘--plugins‘, ‘list all plugin names‘)
  .option(‘-v --verbose‘, ‘Show full function definitions in output‘)
  .action((paths, cmd) => {
    require(‘../lib/inspect‘)(paths, cleanArgs(cmd))
  })

这里的 option 比较多:

  • mode
  • rule
  • plugin
  • rules
  • plugins
  • verbose

在前面的文章中,我们比较常用的有 rule 相关的

再接着看一下 lib/inspect.js 文件:接受 2 个参数:

  • paths
  • args

module.exports = function inspect (paths, args) {
}

核心还是找到 @vue/cli-service,先获取当前执行命令的目录:


const cwd = process.cwd()

let servicePath = resolve.sync(‘@vue/cli-service‘, { basedir: cwd })

最终执行了 node ***/node_modules/@vue/cli-service/bin/vue-cli-service.js inspect 再带上参数:

调用了工具包 execa


const execa = require(‘execa‘)

execa(‘node‘, [
  binPath,
  ‘inspect‘,
  ...(args.mode ? [‘--mode‘, args.mode] : []),
  ...(args.rule ? [‘--rule‘, args.rule] : []),
  ...(args.plugin ? [‘--plugin‘, args.plugin] : []),
  ...(args.rules ? [‘--rules‘] : []),
  ...(args.plugins ? [‘--plugins‘] : []),
  ...(args.verbose ? [‘--verbose‘] : []),
  ...paths
], { cwd, stdio: ‘inherit‘ })

那我们接着往下看,后面就是去 cli-service 目录了:@vue/cli-service/lib/commands/inspect.js

通过 api.registerCommand 来注册一个:


module.exports = (api, options) => {
  api.registerCommand(‘inspect‘, {

  }, args => {

  })
}

在回调函数里面会处理之前的 option 传递的参数:

1、处理 rule


if (args.rule) {
  res = config.module.rules.find(r => r.__ruleNames[0] === args.rule)
}

2、处理 plugin


if (args.plugin) {
  res = config.plugins.find(p => p.__pluginName === args.plugin)
}

3、处理 rules


if (args.rules) {
  res = config.module.rules.map(r => r.__ruleNames[0])
}

4、处理 plugins


if (args.plugins) {
  res = config.plugins.map(p => p.__pluginName || p.constructor.name)
}

其他分支情况比较少用,暂时不做展开。

最后多是通过 webpack-chaintoString 函数来生成,最终在控制台打印:

You can inspect the generated webpack config using config.toString(). This will generate a stringified version of the config with comment hints for named rules, uses and plugins.


const { toString } = require(‘webpack-chain‘)
const output = toString(res, { verbose })

来源:https://segmentfault.com/a/1190000016260585

原文地址:https://www.cnblogs.com/lovellll/p/10138800.html

时间: 2024-10-07 07:04:16

[Vue CLI 3] vue inspect 的源码设计实现的相关文章

【 js 基础 】【 源码学习 】源码设计 (持续更新)

学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析第二部分:underscore 设计分析 第一部分: zepto 设计分析zepto 是一个轻量级的 Javascript 库.相对于 jquery 来说在 size 上更加小,主要是定位于移动设备.它是非常好的学习源码的入门级 javascript 库.这里重点说一下,这个库的设计,而对于详细的源码学习大家可以 star

Android源码设计模式分析开源项目

简述 该项目通过分析Android系统中的设计模式来提升大家对设计模式的理解,从源码的角度来剖析既增加了对Android系统本身的了解,也从优秀 的设计中领悟模式的实际运用以及它适用的场景,避免在实际开发中的生搬硬套.如果你对面向对象的六大开发原则还不太熟悉,那么在学习模式之前先学习一下面向对象的六大原则是非常有必要的. 单例模式 Builder模式 外观模式 模板方法 适配器模式 观察者模式 策略模式 代理模式 迭代器模式 责任链模式 命令模式 桥接模式 原型模式 原文地址:https://g

利用脚手架vue cli搭建vue项目

vue.js https://vuejs.org/ 基础: http://cn.vuejs.org/v2/guide/installation.html 1.安装需要利用npm包管理器,所以首先安装node.js https://nodejs.org/en/download/ 安装好后,打开cmd面板,输入 node -v  (v即 version ,查看node版本) npm是随nodeJs一起安装.所以输入 npm -v 说明npm也已经好了. (安装nodejs后,里面的npm可能不是最新

[Vue CLI 3] Uglify 相关的应用和设计

在本文开始之前,先留一个问题? 如果在新版本我想加一个 drop_console 的配置呢? 在老版本的脚手架生成的配置中,对于线上环境的文件:webpack.prod.conf.js 使用了插件:uglifyjs-webpack-plugin const UglifyJsPlugin = require('uglifyjs-webpack-plugin') 插件配置如下: plugins: [ new UglifyJsPlugin({ uglifyOptions: { compress: {

使用Vue CLI构建Vue项目

第一步:首先在控制台输入vue --version,如果出现版本号则进入第三步:否则进入第二步: 第二步:输入npm install cnpm -g --registry=https://registry.npm.taobao.org,安装淘 宝镜像,以后安装其他依赖时候就可以输入cnpm install --- 了,因为npm安装会非 常慢,一般来说会失败: 第三步:控制台输入vue init webpack my-project  注:这里的my-project就是你要创建的 项目的名称,自

凌煜云商城系统开发详解源码设计

凌煜云商城系统开发(李想.185.6504.8478)互联网是全球性的.这就意味着这个网络不管是谁发明了它,是属于全人类的.互联网的结构是按照"包交换"的方式连接的分布式网络.因此,在技术的层面上,互联网绝对不存在中央控制的问题.也就是说,不可能存在某一个国家或者某一个利益集团通过某种技术手段来控制互联网的问题.反过来,也无法把互联网封闭在一个国家之内-除非建立的不是互联网.然而,与此同时,这样一个全球性的网络,必须要有某种方式来确定联入其中的每一台主机.在互联网上绝对不能出现类似两个

基于Tornado签名cookie源码设计API认证

想法1 服务端客户端个保存相同的一串字符串,客户端发送API请求时带着这段字符串来我服务端做校验,通过则返回相应数据,否则拒绝访问 弊端 黑客截取到请求信息,可直接会获取到该字符串,想服务端发送请求并能获取到数据,安全性太低 想法2 设置动态的随机验证码,那么字符串我们不变,利用时间的动态性,我们将固定的字符串加上当前请求时间,利用md5加密算法生成随机验证码,那么我们在发送数据的时候,除了要发生成的随机验证码外,还要将当前请求的时间也一并发给服务端,这样服务端才可以利用客户端发来的时间和实现存

super token钱包系统APP源码设计开发

super token超级钱包系统介绍 super token钱包系统注册赠送0.1-50美金,相当0.1--500个spor币,1000万完毕. super token钱包系统200美金开启搬砖还送0.1--500个spor币,2000万完毕. super token钱包系统12月25日10点开启0.1美金私募8千万枚. [范生:1300-5668-659]super token钱包系统抢到赚到!限每人认筹4400枚. super token钱包系统4号开始送2个eth以太仿增加搬砖收益. s

Vue CLI 3搭建vue+vuex 最全分析

一.介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.有三个组件: CLI:@vue/cli 全局安装的 npm 包,提供了终端里的vue命令(如:vue create .vue serve .vue ui 等命令) CLI 服务:@vue/cli-service是一个开发环境依赖.构建于 webpack 和 webpack-dev-server 之上(提供 如:serve.build 和 inspect 命令) CLI 插件:给Vue 项目提供可选功能的 npm 包 (如