Сейчас, когда нужно собрать проект, я пишу в терминале gulp build, когда создать новый БЭМ-блок — gulp block -n block-name. Но сейчас изучил несколько стартовых шаблонов (например), там все то же самое запускается через npm, который в свою очередь запускает галп-таск. Например, npm run build.
Какой подход верный, как стоит делать и почему?
Верно и так и так, но есть нюансы.
Предположим есть проект, в нем есть таск для сборки js (с помощью gulp).
Вы можете его запустить вот так - npm run build-js либо gulp build-js.
Однажды, кто-то из разработчиков переделал таск сборки js (теперь собирается с помощью webpack).
npm run build-js по-прежнему работает, а gulp build-js будет ругаться, что такого таска нет, потому что теперь нужно запускать - webpack build-js
В принципе разницы нет (оверхед на такой запуск пренебрежим по сравнению с временем сборки).
Но когда скапливается 10 проектов, на одном gulp, на другом webpack, grunt, parcel, rollup, browserify, jspm... начинаешь ценить проекты, которые запускаются npm start, тесты прогоняются npm test, а сборка npm run build. Это просто такое негласное соглашение, которое облегчает ментальную нагрузку при переключении между проектами.