작업의 동적 로딩 메커니즘(고급)


아마도 tmt-workflow의 모든 프로젝트가 node_modules의 복사본 하나만 공유하고 모든 작업이 gulpfile.js 외부 _tasks 디렉터리에서 구현은 실제로 매우 간단합니다. 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

먼저 gulpfile.js를 살펴보겠습니다
rrreee🎜gulp 작업이 실행될 때마다 _tasks 디렉터리를 찾습니다. 여기에 정의된 레벨은 3입니다. 즉, gulpfile.js에서는 _tasks가 이 3개 레벨 내에 있는 한 3개 레벨을 조회합니다. 디렉토리가 매우 깊은 경우 여기에서 3개를 변경하면 됩니다. 🎜🎜그런 다음 _tasks 디렉터리에 있는 index.js를 살펴보세요.🎜rrreee🎜실제로는 task로 시작하는 모든 파일을 로드하는 것입니다. 각 gulp 작업을 task로 시작하는 js 파일로 정의합니다. 이러한 방식으로 모든 gulp 작업은 동적으로 등록되고 node_modules를 공유합니다. 🎜🎜