@vue/cli-plugin-babel/index.js 中:


api.genCacheConfig('babel-loader', {}, [])

我们看一下 api.genCacheConfig 在文件:@vue/cli-service/lib/PluginAPI.js 中被定义:

Generate a cache identifier from a number of variables

在函数一开始接受 3 个参数:

  • id
  • partialIdentifier
  • configFiles

然后看一下函数的内部:

返回:

  • cacheIdentifier
  • cacheDirectory

genCacheConfig (id, partialIdentifier, configFiles) {
const cacheDirectory = this.resolve(`node_modules/.cache/${id}`)
const variables = {}
const cacheIdentifier = hash(variables)
return { cacheDirectory, cacheIdentifier }
}

我们打印了 cacheDirectory 目录,发现一个目录地址:


/Users/***/node_modules/.cache

我本地的有 4 个文件夹:

  • babel-loader
  • uglifyjs-webpack-plugin
  • eslint-loader
  • vue-loader

我们上面 cli-plugin-babel 就是指向了 babel-loader 的目录:

上面的 hash 用到了:


const hash = require('hash-sum')

/Users/***/node_modules/.cache/babel-loader

首先,babel-loader 是不具备去一个 .cache 目录写入文件的,那到底是谁呢?

还记得我们之前通过 vue inspect --rule js 打印的 babelwebpack 配置吗?


/* config.module.rule('js') */
{
test: /\.jsx?$/,
exclude: [
function () { /* omitted long function */ }
],
use: [
/* config.module.rule('js').use('cache-loader') */
{
loader: 'cache-loader',
options: {
cacheDirectory: '/Users/***/node_modules/.cache/babel-loader',
cacheIdentifier: '2f4347b9'
}
},
/* config.module.rule('js').use('babel-loader') */
{
loader: 'babel-loader'
}
]
}

这里面的 use 配置在 babel-loader 之前配置了一个 cache-loader


{
loader: 'cache-loader',
options: {
cacheDirectory: '/Users/***/node_modules/.cache/babel-loader',
cacheIdentifier: '2f4347b9'
}
}

cache-loader 到底做什么的呢:

Caches the result of following loaders on disk (default) or in the database

它的使用中有一个示例:

Add this loader in front of other (expensive) loaders to cache the result on disk.

一般它会放置在 use 配置里面,而且是其他 loaders 的前面:


module.exports = {
module: {
rules: [
{
test: /\.ext$/,
use: [
'cache-loader',
...loaders
],
include: path.resolve('src')
}
]
}
}

那其实结果就很清晰了,写文件的就是它:

一开始通过 Set 来创建一个对象,后面还使用了 addhas


var directories = new Set();

它有一个函数 write,接受 3 个参数:

  • key
  • data
  • callback

function write(key, data, callback) {
var dirname = path.dirname(key);
var content = JSON.stringify(data); if (directories.has(dirname)) {
// for performance skip creating directory
fs.writeFile(key, content, 'utf-8', callback);
} else {
mkdirp(dirname, function (mkdirErr) {
if (mkdirErr) {
callback(mkdirErr);
return;
} directories.add(dirname); fs.writeFile(key, content, 'utf-8', callback);
});
}
}

这里创建目录用到了:mkdirp 来创建目录


var mkdirp = require('mkdirp');

然后通过 fs.writeFile 来写文件


var fs = require('fs');
fs.writeFile(key, content, 'utf-8', callback);

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

[Vue CLI 3] 插件开发中的 genCacheConfig 细节研究的更多相关文章

  1. Vue CLI 3开发中屏蔽的EsLint错误 (.eslintrc.js 在vue3+中 修改这个)

    1.关闭eslint校验有了eslint的校验,可以来规范开发人员的代码,是挺好的.但是有些像缩进.空格.空白行之类的规范,在开发过程中一直报错,未免太过于苛刻了.所以,我还是会选择关闭eslint校 ...

  2. 关于Vue.cli 脚手架环境中引入Bootstrap时,table表格样式缺失的解决办法

    Vue+bootstrap不能正常使用table的样式 环境:下载官网的本地bootstrap包,然后在vue 的index.html引入bootstrap的css和js环境 问题描述:1. vue里 ...

  3. [Vue CLI 3] 插件开发之 registerCommand 到底做了什么

    首先,我们看到在 package.json 中有 scripts 的定义: "scripts": { "serve": "vue-cli-servic ...

  4. 专访Vue作者尤雨溪:Vue CLI 3.0重构的原因

    1.为什么要对 Vue CLI 进行大规模修改? 尤雨溪认为旧版本的 Vue CLI 本质上只是从 GitHub 拉取模版,这种拉模版的方式有几个问题: (1) 在单个模版里面同时支持太多选项会导致模 ...

  5. Vue Cli 中使用 Karma / Chrome 执行样式相关单元测试

    在 GearCase 开源项目 中,我使用了 Vue Cli 的默认测试框架.因此和样式相关的东西,都无法进行测试.因为它并不类似于无头浏览器,而是存在于虚拟内存之中. 现状 在如下 button.s ...

  6. Vue CLI 3 中文文档

    翻译文档 文档翻译全貌 前言 之前写了一篇Vue CLI 3.x 版本的简单体验,当时文档还不全,具体的使用方法并不是很清楚,大概是2月7号,收到Vue CLI 3接近Beta版的提示,作者尤雨溪也讲 ...

  7. vue cli 中关于vue.config.js中chainWebpack的配置

    Vue CLI  的官方文档上写:调整webpack配置最简单的方式就是在vue.config.js中的configureWebpack选项提供一个对象. Vue CLI 内部的 webpack 配置 ...

  8. vue cli中的env详解

    前言 相信使用过 vueCli 开发项目的小伙伴有点郁闷,正常开发时会有三个接口环境(开发,测试,正式),但是 vueCli 只提供了两种 development,production(不包含 tes ...

  9. vue cli 3

    介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统 通过 @vue/cli 搭建交互式的项目脚手架. 通过 @vue/cli + @vue/cli-service-global 快 ...

随机推荐

  1. mv- Linux必学的60个命令

    1.作用 mv命令用来为文件或目录改名,或者将文件由一个目录移入另一个目录中,它的使用权限是所有用户.该命令如同DOS命令中的ren和move的组合. 2.格式 mv[options] 源文件或目录 ...

  2. Luogu P3209 [HNOI2010]平面图判定(2-SAT)

    P3209 [HNOI2010]平面图判定 题意 题目描述 若能将无向图\(G=(V,E)\)画在平面上使得任意两条无重合顶点的边不相交,则称\(G\)是平面图.判定一个图是否为平面图的问题是图论中的 ...

  3. Nginx报错汇总

    1.     Nginx 无法启动解决方法 在查看到 logs 中报了如下错误时: 0.0.0.0:80 failed (10013: An attempt was made to access a ...

  4. 跟我一起在ubuntu中安装docker

    卸载旧版本 $ sudo apt-get remove docker docker-engine docker.io 查看ubuntu版本 设置安装源 通过如下步骤,设置安装源仓库,这里我们使用阿里源 ...

  5. wc,sort,uniq,awk,grep

    wc awk, sort, uniq grep

  6. vim用户设置

    此配置目前使用户mac,linux,win,但是win系统需要提前配置mingw32相关的gcc系统路径等信息. " Setting some decent VIM settings for ...

  7. jeecmsv9-adminVue 打包出错

    F:\jeecms\jeecmsv9-adminVue>node build\build.js - building for production...Error processing file ...

  8. 转载 ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天

    ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天   看起来挺简单,细节还是很多的,好,接上一篇,我们已经成功连接singalR服务器 ...

  9. httpclient遇到java.net.URISyntaxException: Illegal character in scheme name at index 0:

    正准备按照大佬的解决办法处理, 看会一条回复,说url有空格 检查了一下,还真是有空格 去除url中的空格,问题解除

  10. jmeter参数化之用户自定义变量

    1.     用badboby进行录制,录制完成后保存,用JMeter格式进行保存,如:登陆.jmx 2.     在jmeter中打开保存的文件登陆.jmx. 3.线程组右击-添加-配置元件-用户定 ...