Одна вещь, которая мне не нравится в Node, заключается в том, что как только вы добавляете одну require("whatever")
, вы получаете тысячи транзитивных зависимостей, которые вызывают require
на случай, если код может понадобиться.
var whatever = require('whatever');
if (probablyFalse) {
whatever.theOnlyFunctionThatIUse();
// ...but `whatever` et al require other libraries which I won't actually use
}
Я хочу создать пакет для развертывания в Google Cloud Functions (и подобных приложениях на Lambda). Мой код импортирует @ google-cloud / datastore, который имеет много транзитивных зависимостей, некоторые из которых имеют двоичные файлы, вычисленный импорт и т. Д. Я не хочу сталкиваться с ограничениями размера пакета или увеличивать время, необходимое для анализа кода Node . Я хочу использовать инструмент упаковки, который встряхивает дерево и компилирует (большую часть) мой код и зависимости в один файл. Я хочу иметь возможность указать, какие библиотеки исключить из index.js
, и предоставить только необходимые файлы в node_modules
.
Поскольку я компилирую Typescript и использую другие библиотеки в процессе сборки / тестирования / пакета / развертывания, node_modules содержит от 100 до 1000 библиотек, большинство из которых не нужны в производстве.
В идеале я бы хотел построить что-то похожее на:
- package.json - {"main": "index.js", зависимости: {"@ google-cloud / datastore": "1.4.1"}}
- index.js - скомпилирован из нескольких файлов TypeScript в моем проекте и большей части кода, который я импортирую из библиотек и транзитивных зависимостей.
- node_modules - все, но только код, который не включен в index.js, но необходим для запуска приложения.
Я создал простое демонстрационное приложение, чтобы показать, что я пытаюсь сделать (в настоящее время я использую FuseBox):
https://github.com/nalbion/packaged-google-function/blob/master/lib/demo.js
Чтобы исключить @ google-cloud / datastore и его транзитивные зависимости из моего скомпилированного demo.js, я добавил filterFile:
filterFile: file => {
return !['@google-cloud/datastore'].includes(file.collection.name);
},
Меня смущают строки в выводе:
FuseBox.pkg("@google-cloud/datastore", {}, function(___scope___){
return ___scope___.entry = "src/index.js";
});
Google Cloud Functions тоже запутались:
TypeError: Cannot read property 'default' of null
at helloWorld (/user_code/demo.js:10:42)
Для справки, демонстрация работала, пока я не попытался добавить код хранилища данных:
https://github.com/nalbion/packaged-google-function/blob/no-dependencies/lib/demo.js
Я подозреваю, что filterFile не предназначен для этой цели, или, может быть, я неправильно его использую.
Есть ли в FuseBox аналог для фильтрации пакетов?
Есть ли лучший способ сделать это?
(Edit) Известная проблема с частными репозиториями git:
https://github.com/GoogleCloudPlatform/nodejs-docs-samples/issues/300
Автоматическое развертывание облачных функций Google из Google Cloud Контроль версий