タスクの動的読み込みメカニズム (上級)
おそらく、tmt-workflow
内のすべてのプロジェクトは node_modules
のコピーを 1 つだけ共有し、すべてのタスクも 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
を見てみましょう_tasks
ディレクトリが検索されます。ここで定義されているレベルは 3 です。つまり、gulpfile.js では、_tasks
がこれら 3 つのレベル内にある限り、3 つのレベルを検索します。ディレクトリが非常に深い場合は、ここで 3 を変更するだけです。 🎜🎜次に、_tasks
ディレクトリの index.js
を見てください:🎜rrreee🎜 実際には、tasks
で始まるすべてのファイルをロードします。各 gulp タスクを task
で始まる js ファイルとして定義します。このようにして、すべての gulp タスクが動的に登録され、node_modules
を共有します。 🎜🎜