博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Vue CLI 3] 插件开发中的 genCacheConfig 细节研究
阅读量:6896 次
发布时间:2019-06-27

本文共 2786 字,大约阅读时间需要 9 分钟。

@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 来创建一个
对象,后面还使用了
add
has
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

转载于:https://www.cnblogs.com/lovellll/p/10139048.html

你可能感兴趣的文章
Android 四大组件学习之ContentProvider四
查看>>
#include <sys/socket.h>找不到头文件
查看>>
CSS绘制简单图形
查看>>
一篇文章快速了解 量子计算机 (精心整理)【原创】 (2)
查看>>
SQL Server系统表sysobjects介绍与使用
查看>>
scala中Map和Tuple
查看>>
VUE 数据绑定
查看>>
021_nginx动态upstream检查
查看>>
Moogoose Constructor小坑
查看>>
Oracle报错:ORA-06508: PL/SQL: 无法找到正在调用的程序单元
查看>>
thinkphp自动完成、软删除 和时间戳
查看>>
线程的等待方法:join
查看>>
android 拍照声音文件路径
查看>>
keystone v2 to v3
查看>>
学好Android开发的几条建议-----选好教材很重要
查看>>
respondsToSelector
查看>>
PHP实例——获取客户端IP地址
查看>>
HDOJ-1999 不可摸数
查看>>
HDOJ---4278 Faulty Odometer[进制转化]
查看>>
需求与设计过程(1)-用例
查看>>