vue.config.js 配置中有一个 indexPath 的配置,我们先看看它有什么用?

用来指定 index.html 最终生成的路径(相对于 outputDir)

先看看它的默认值:在文件 @vue/cli-service/lib/options.js


indexPath: joi.string()

默认值:


indexPath: 'index.html'

使用案例:

我们在 vue.config.js 中配置:


indexPath: '1/2/3/b.html'

最终在编译之后的目录 dist(默认)下面会生成:

1/2/3/b.html 的文件,内部不会发生变化

我们看一下背后的实现:@vue/cli-service/lib/config/app.js 文件中

两层判断:

1、先判断是不会 product 环境


const isProd = process.env.NODE_ENV === 'production'
if (isProd) {}

2、是否配置了 indexPath


if (options.indexPath !== 'index.html') {
}

通过内置的插件去修改路径,插件文件在 cli-service/lib/webpack/MovePlugin.js


webpackConfig
.plugin('move-index')
.use(require('../webpack/MovePlugin'), [
path.resolve(outputDir, 'index.html'),
path.resolve(outputDir, options.indexPath)
])

这个对应的配置,默认的编译之后的目录是 dist,传入了 2 个路径:


/* config.plugin('move-index') */
new MovePlugin(
'/Users/***/dist/index.html',
'/Users/***/dist/1/2/3/b.html'
)

我们看一下 webpack 4 下的插件是如何编写的:

1、它是 class 的方式:

内部包含了 constructor 和 apply(参数是 compiler)


module.exports = class MovePlugin {
constructor () {}
apply (compiler) {}
}

2、constructor 里面其实要处理传入的参数:


constructor (from, to) {
this.from = from
this.to = to
}

定义了一个 from,一个 to,然后其实就是把 from 通过 fs 的 moveSync 函数移动到 to 里面:

这里我们依赖了工具包:fs-extra


const fs = require('fs-extra')

具体流程如下:先判断 from 的路径是否存在


if (fs.existsSync(this.from)) {
fs.moveSync(this.from, this.to, { overwrite: true })
}

3、apply 内部的结构呢


compiler.hooks.done.tap('move-plugin', () => {
// ...
})

通过 compiler tap 来注册插件,这里的 done 是一个生命周期的钩子函数:编译完成


compiler.hooks.someHook.tap()

这里还有其他钩子:

  • run
  • beforeRun
  • compile
  • beforeCompile
  • afterCompile
  • emit
  • afterEmit

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

[Vue CLI 3] 配置解析之 indexPath的更多相关文章

  1. [Vue CLI 3] 配置解析之 parallel

    官方文档中介绍过在 vue.config.js 文件中可以配置 parallel,作用如下: 是否为 Babel 或 TypeScript 使用 thread-loader. 该选项在系统的 CPU ...

  2. [Vue CLI 3] 配置解析之 css.extract

    大家还记得我们在老版本中,对于线上环境配置中会把所有的 css 多打成一个文件: 核心是使用了插件 extract-text-webpack-plugin,方式如下: 第一步都是加载插件 const ...

  3. @vue/cli的配置知道多少-publicPath,outputDir,assetsDir,indexPath,filenameHashing,configureWebpack,productionSourceMap

    vue.config.js的简单介绍 vue.config.js 是一个可选的配置文件, 在项目的 (和 package.json 同级的) 根目录中存在这个文件. 默认情况没有这个文件需要我们手动去 ...

  4. Vue CLI 3 配置兼容IE10

    最近做了一个基于Vue的项目,需要兼容IE浏览器,目前实现了打包后可以在IE10以上运行,但是还不支持在运行时兼容IE10及以上. 安装依赖 yarn add --dev @babel/polyfil ...

  5. [Vue CLI 3] 配置 webpack-bundle-analyzer 插件

    首先还是简单介绍一下 webpack-bundle-analyzer 是做什么的: Visualize size of webpack output files with an interactive ...

  6. Vue CLI 3.0脚手架如何在本地配置mock数据

    前后端分离的开发模式已经是目前前端的主流模式,至于为什么会前后端分离的开发我们就不做过多的阐述,既然是前后端分离的模式开发肯定是离不开前端的数据模拟阶段. 我们在开发的过程中,由于后台接口的没有完成或 ...

  7. vue cli 3 lintOnSave 配置有时无效问题

    一个使用vue cli 3.2创建的项目,创建时未开启 lintOnSave,后来希望开启并设置为 lintOnSave: 'error',但配置不生效. 解决方法1:新创建项目(此时vue cli ...

  8. 使用 vue-cli-service inspect 来查看一个 Vue CLI 3 项目的 webpack 配置信息(包括:development、production)

    使用 vue-cli-service inspect 来查看一个 Vue CLI 3 项目的 webpack 配置信息(包括:development.production) --mode 指定环境模式 ...

  9. @vue/cli 3.x项目脚手架 webpack 配置

    @vue/cli  是一个基于 Vue.js 进行快速开发的完整系统. @vue/cli   基于node服务  需要8.9以上版本 可以使用 nvm等工具来控制node版本  构建于 webpack ...

随机推荐

  1. C/C++编译的程序内存组成:

    #include int main(){int a[1000000];//局部变量return 0;}编译运行后发现溢出错误.#include int a[1000000];//全局变量int mai ...

  2. 浪潮云+/云加 App 智能化的企业移动办公平台官网下载地址

    上Google?Facebook? 点这里: 手机端:https://ecm.inspur.com/ 桌面端:https://ecm.inspuronline.com/

  3. [转]C#委托的异步调用

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...

  4. Flink 1.9 实战:使用 SQL 读取 Kafka 并写入 MySQL

    上周六在深圳分享了<Flink SQL 1.9.0 技术内幕和最佳实践>,会后许多小伙伴对最后演示环节的 Demo 代码非常感兴趣,迫不及待地想尝试下,所以写了这篇文章分享下这份代码.希望 ...

  5. 威胁快报|Solr dataimport成挖矿团伙新型利用方式

    概述 近日,阿里云安全团队监测到挖矿团伙利用solr dataimport RCE(CVE-2019-0193)作为新的攻击方式对云上主机进行攻击,攻击成功后下载门罗币挖矿程序进行牟利.该团伙使用的恶 ...

  6. 自动化运维工具Ansible工具

    目录 一.初识Ansible 二.Ansible的架构 三.Ansible基础使用 安装 主机清单 管理主机 四.Ansible用脚本管理主机 五.Ansible模块Module 六.Ansible常 ...

  7. SpringMVC,3种不同的URL路由配置方法 [转]

    SpringMVC中配置URL拦截,非常简单.网上找个示例,就能通过.但是,在我做了好几个Web项目,又参与了别人主导的Web项目时,发现URL配置也非常有学问. 1. 先说说一种比较常见的: < ...

  8. 原生JS实现简易计算器

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  9. Python爬虫笔记【一】模拟用户访问之设置处理cookie(2)

    学习的课本为<python网络数据采集>,大部分代码来此此书. 做完请求头的处理,cookie的值也是区分用户和机器的一个方式.所以也要处理一下cookie,需要用requests模块,废 ...

  10. fft模板 HDU 1402

    // fft模板 HDU 1402 #include <iostream> #include <cstdio> #include <cstdlib> #includ ...