Mekanisme pemuatan dinamik tugas (lanjutan)


Mungkin anda telah mendapati bahawa semua projek dalam tmt-workflow hanya berkongsi satu salinan node_modules dan semua tugasan juga ditakrifkan dalam gulpfile.js Dalam direktori _tasks luaran, pelaksanaannya sebenarnya sangat mudah. 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

Mari kita lihat dahulu gulpfile.js
rrreee🎜Setiap kali tugas teguk dilaksanakan, ia akan mencari direktori _tasks Tahap yang ditakrifkan di sini ialah 3, iaitu Dalam gulpfile.js, ia akan mencari 3 peringkat, selagi _tasks berada dalam 3 peringkat ini Jika direktori anda sangat mendalam, cuma tukar 3 di sini. 🎜🎜Kemudian lihat index.js dalam direktori _tasks:🎜rrreee🎜Malah, ia adalah untuk memuatkan semua fail bermula dengan task dalam direktori semasa. Kami Mentakrifkan setiap tugas gulp sebagai fail js bermula dengan task Dengan cara ini, semua tugas gulp didaftarkan secara dinamik dan berkongsi node_modules. 🎜🎜