Mécanisme de chargement dynamique des tâches (avancé)


Peut-être avez-vous découvert que tous les projets dans tmt-workflow ne partagent qu'une seule copie de node_modules, et que toutes les tâches sont également définies dans gulpfile.js Dans le répertoire externe _tasks, l'implémentation est en réalité très simple. tmt-workflow 所有项目只共享一份 node_modules,所有的 task 也都是定义在 gulpfile.js 外的 _tasks 目录下,其实现方式其实很简单。

我们先看项目下面的 gulpfile.js

var gulp = require('gulp');
var fs = require('fs');
var path = require('path');

//注册
var deep = 3;
run_tasks('_tasks');

function run_tasks(tasks_path) {
    if (--deep < 0) {
        throw new Error('something wrong in require tasks!');
        return;
    }

    tasks_path = path.join('../', tasks_path);

    if (fs.existsSync(tasks_path)) {
        require(tasks_path)(gulp);
    } else {
        run_tasks(tasks_path);
    }
}

每一次执行 gulp 任务时,会向上寻找 _tasks 目录,这里定义的层级为 3,也就是在 gulpfile.js 会向上寻找 3 个层级,只要 _tasks 在这 3 个层级内即可,如果你的目录很深很深,改一下这里的 3 即可。

接着看 _tasks 目录下的 index.js:

 fs.readdirSync(__dirname).filter(function (file) {
    return (file.indexOf(".") !== 0) && (file.indexOf('task') === 0);
}).forEach(function (file) {
    var registerTask = require(path.join(__dirname, file));
    registerTask(gulp, config);
});

其实就是加载当前目录下所有以 task 开头的文件,我们将各个 gulp 任务都定义成一个个以 task 开头的 js 文件,这样,就动态的注册了所有 gulp 任务,共用了一个 node_modules

Regardons d'abord gulpfile.js
rrreee🎜Chaque fois qu'une tâche gulp est exécutée, elle recherchera le répertoire _tasks. Le niveau défini ici est 3, c'est-à-dire que dans gulpfile.js, il recherchera 3 niveaux, tant que _tasks se trouve dans ces 3 niveaux. Si votre répertoire est très profond, changez simplement 3 ici. 🎜🎜Ensuite regardez index.js dans le répertoire _tasks :🎜rrreee🎜En fait, il s'agit de charger tous les fichiers commençant par task dans le répertoire courant. Nous définissons chaque tâche gulp comme un fichier js commençant par task. De cette façon, toutes les tâches gulp sont enregistrées dynamiquement et partagent un node_modules. 🎜🎜