Что мне не нравится в Node, так это то, что как только вы добавляете одну require("whatever")
, вы получаете 1000 транзитивных зависимостей, которые вызывают require
при вероятности того, что код может понадобиться.
var whatever = require('whatever');
if (probablyFalse) {
whatever.theOnlyFunctionThatIUse();
// ...but `whatever` et al require other libraries which I won't actually use
}
Я хочу создать пакет для развертывания в облачных функциях Google (и аналогичных приложениях в 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 также сбиты с толку:
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 Source Control