『手撕Vue-CLI』函数柯里化优化代码

vue,cli · 浏览次数 : 0

小编点评

**函数柯里化优化** **优化目标:** * 使用函数柯里化优化代码,减少重复代码并提高代码可读性。 **实现方式:** * 创建一个函数柯里化函数。 * 使用函数柯里化将多个参数传递给目标函数。 **示例:** ```javascript // 原有函数 function demo(a, b) { return a + b; } // 函数柯里化函数 const calculate = (a, b) => demo(a, b); // 调用函数柯里化的代码 const result = calculate(1, 2); console.log(result); // 输出 3 ``` **优化控制台加载效果:** * 优化控制台加载效果,减少重复代码并提高代码可读性。 * 将控制台加载效果单独提取出来,并使用函数柯里化来简化代码。 **改造代码:** ```javascript // 优化获取模板名称 const waitLoading = async (message, fn) => { const spinner = ora(message).start(); const result = await fn(); spinner.succeed(`${message} successfully`); return result; }; // 优化获取版本号 const waitLoading = async (message, fn) => { const spinner = ora(message).start(); const result = await fn(...args); spinner.succeed(`${message} successfully`); return result; }; ```

正文

开篇

在上一篇文章中,给 nue-cli 添加了拉取版本号的功能,这一次来优化一下代码,使用函数柯里化的方式来优化代码。

实现

函数柯里化

函数柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。

在进行改写之前,首先给大家简单介绍一下函数柯里化,写一个简单的例子来演示一下。

function demo(a, b) {
    return a + b;
}

const res = demo(1, 2);
console.log(res);

这是一个简单的函数,接收两个参数,然后返回两个参数的和,除了这种写法其实还可以改写成这样:

function demo(a) {
    return function (b) {
        return a + b;
    };
}

这个时候呢,该如何调用呢?首先是调用 demo 方法,传入一个参数,然后返回一个函数,再调用这个函数,传入另一个参数,最后得到结果。

const res = demo(1)(2);
console.log(res);

了解了这种写法之后,就可以使用函数柯里化来优化代码了。

优化控制台加载效果

为什么是要优化控制台加载效果呢?因为我发现后续可能对控制台加载效果的需求会比较多,所以就把这个功能单独提取出来。

例如像之前拉取模板名称,拉取版本号,拉取模板等等,都需要控制台加载效果,所以就把这个功能单独提取出来,以后需要的时候直接调用就可以了。

const waitLoading = async ( message, fn) => {
    const spinner = ora(message).start();
    const result = await fn();
    spinner.succeed(`${message} successfully`);
    return result;
}

这个函数接收两个参数,第一个参数是 message,第二个参数是 fnmessage 是控制台加载效果的提示信息,fn 是一个异步函数,这个函数会返回一个 Promise 对象,然后在函数内部调用 ora,显示加载效果,然后调用 fn,等待 fn 执行完毕,最后关闭加载效果。

改造获取模板名称

主要就是将 fetchRepoList 中通过 ora 显示加载效果的代码删除掉,然后调用 waitLoading 函数,将 fetchRepoList 传入进去,这样就改造完成了。

const fetchRepoListData = await waitLoading('downloading template names...', fetchRepoList)();

改造获取版本号

这里改造其实是一样的,不过这里有一个小问题,就是 getTemplateTags 这个函数是需要传入一个参数的,所以需要对 waitLoading 进行改造。

const waitLoading =  ( message, fn) => async (...args) => {
    const spinner = ora(message).start();
    const result = await fn(...args);
    spinner.succeed(`${message} successfully`);
    return result;
}

这回的 waitLoading 方法与之前的不同地方就是在添加了一个 ...args 参数,这个参数是用来接收 fn 函数的参数的,然后在调用 fn 的时候将参数传入进去。

接下来就是改造调用 getTemplateTags 的地方了。

const fetchTemplateTags = await waitLoading('downloading template tags...', getTemplateTags)(template);

由于改造了 waitLoading 方法,之前调用 waitLoading 方法的地方也需要进行改造,就是多加一个调用过程。

好,大致就是这样,本篇文章就到这里了,下一篇文章继续完善 nue-cli。

与『手撕Vue-CLI』函数柯里化优化代码相似的内容:

『手撕Vue-CLI』函数柯里化优化代码

开篇 在上一篇文章中,给 nue-cli 添加了拉取版本号的功能,这一次来优化一下代码,使用函数柯里化的方式来优化代码。 实现 函数柯里化 函数柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。 在进行改写之前,首先给大家简单介绍一下函数柯里化,写一个简单的例子来演示一下。

『手撕Vue-CLI』获取下载目录

开篇 在上一篇文章中,简单的对 Nue-CLI 的代码通过函数柯里化优化了一下,这一次来实现一个获取下载目录的功能。 背景 在 Nue-CLI 中,我现在实现的是 create 指令,这个指令本质就是首先拿到模板名称和版本号之后,然后去进行下载对应的模板,关于下载那么肯定要面临的问题就是如何下载?下

『手撕Vue-CLI』完善提示信息

前言 经过『手撕Vue-CLI』自动安装依赖,已经实现了自动安装依赖的功能。 然而,虽然项目已复制并安装依赖,但其提示信息并不够友好,于是我试着去运行了一下vue create,发现其提示信息是这样的: 于是我决定完善提示信息,也借此机会完善一下项目的代码,变量命名等。 完善提示信息 完善变量命名

『手撕Vue-CLI』自动安装依赖

开篇 经过『手撕Vue-CLI』拷贝模板,实现了自动下载并复制指定模板到目标目录。然而,虽然项目已复制,但其依赖并未自动安装,可能需要用户手动操作,这并不够智能。 正如前文所述,我们已经了解了业务需求和背景。那么,接下来我们将直接深入探讨核心实现细节。 自动安装依赖 在前文中,我们已经将模板文件复制

『手撕Vue-CLI』拷贝模板

开篇 经过上篇文章的介绍,实现了可以根据用户选择的模板名称加上对应的版本号,可以下载对应的模板,并且将下载之后的文件存放在用户目录下的 .nue-template文件夹中。 接下来这篇文章主要实现内容是将下载的模板文件拷贝到当前所执行命令的目录下。 拷贝模板 例如我现在在终端当中输入 nue-cli

『手撕Vue-CLI』下载指定模板

开篇 经上篇文章的介绍,实现了获取下载目录地址,接下来实现下载指定模板的功能。 背景 通过很多章节过后,已经可以拿到模板名称,模板版本号,下载目录地址,这些信息都是为了下载指定模板做准备的。 实现 如何从 GitHub 下载模板 可以借助 download-git-repo 这个库来下载 GitHu

『手撕Vue-CLI』拉取版本号

开篇 在上一篇文章中,给 nue-cli 添加了与用户终端交互的功能,这一次来实现一个拉取版本号的功能。 这个功能的背景是,有时候我们在使用脚手架的时候,不同版本的脚手架可能会有不同的功能,所以用户有可能会根据自己的需求选择不同的版本,所以这里将会实现一个根据用户选择的版本号,拉取对应的版本号的模板

『手撕Vue-CLI』添加终端用户交互

前言 经过上一篇文章的梳理,实现了可以从 GitHub 上拉取模板项目名称,已经可以得知可使用的模板有哪些了,那么我觉得是不是要进行选择呢?所以这一篇文章就来实现终端用户交互,让用户可以自己选择想要使用的模板。 实现 在 NodeJS 当中,已经有人为我们封装好了一个库,叫做 inquirer,可以

『手撕Vue-CLI』拉取模板名称

前言 好,经过上篇文章的介绍,已经可以有处理不同指令的能力了,接下来我们就来处理 vue create 指令,这个指令的本质就是从网络上下载提前准备好的模板,然后再自动安装模板中相关依赖。 所以实现 create 指令分为两步: 下载指定模板 安装模板中的依赖 先来看看官方的吧,我在终端中已经输入了

『手撕Vue-CLI』处理不同指令

前言 在上一篇『手撕Vue-CLI』添加自定义指令中,已经实现了自定义指令的添加,但是指令还是比较简单的,只是简单的打印一句话,那么在实际运用场景中,可能会有更多的需求,比如可能需要在指令中传递参数,或者需要在指令中进行一些复杂的操作,那么这个时候我们就需要对指令进行处理了。 创建指令处理文件 在上