Безсерверная конфигурация webpack, добавление каталога вручную
У меня есть следующий код, который я запускаю, который не работает, потому что он не может найти папку моделей, когда я загружаю в Amazon.
exports.setModels = function(connection,modelPath){
//Import all the known models for the project.
//Proof of Stage being set.
console.log("stage for models="+stage);
const fs = require('fs');
const dir = modelPath;
var models = {};
//@JA - Wait until this function finishes ~ hence readdirSync vs regular readdir which is async
fs.readdirSync(dir).forEach(file => {
console.log("file="+file);
//Split the .js part of the filename
var arr = file.split(".");
var name = arr[0].toLowerCase();
//Create a modle object using the filename as the reference without the .js pointing to a created sequelize instance of the file.
var modelPath = "../models/"+file; //default assumes same directory that was used to scan.
if(process.env.DOMAIN_NAME){ //If this enviroment variable is detected then change the modelPath.
modelPath = "../../../../models/"+file;
}
models[name] = connection.import(modelPath);
})
return models;
}
Изучив проблему, я обнаружил ее, поскольку папка моделей не упаковывается безсерверным плагином веб-пакета.
Недавно я узнал, как заставить определенные пакеты загружать, используя этот код в моем файле без сервера.
webpackIncludeModules:
forceInclude:
- mysql
- mysql2
Однако это будет включать только пакеты, и когда я попытался сослаться на папку моделей для автоматического включения всех моих моделей сиквелиза, я получил сообщение о том, что это не пакет, что, конечно, имеет смысл.
Это оставляет меня с вопросом о том, как я могу заставить его упаковать каталог моделей без ручного выполнения запроса для каждой модели. Я написал динамическую функцию, чтобы получить их во время выполнения и импортировать ее для продолжения.
Информация о плагине находится здесь ( https://github.com/serverless-heaven/serverless-webpack), я просмотрел все это, но не могу найти ответ.
Вывод упаковки с использованием serverless выглядит следующим образом: отсутствует папка models со всеми моими моделями sequelize.
Мой основной каталог перед выполнением webpack выглядит следующим образом.
Вот и мой webpack.config.js.
const slsw = require("serverless-webpack");
const nodeExternals = require("webpack-node-externals");
module.exports = {
entry: slsw.lib.entries,
target: "node",
// Since 'aws-sdk' is not compatible with webpack,
// we exclude all node dependencies
externals: [nodeExternals()],
// Run babel on all .js files and skip those in node_modules
module: {
rules: [
{
test: /\.js$/,
loader: "babel-loader",
include: __dirname,
exclude: /node_modules/
}
]
}
};
1 ответ
Вы можете использовать copy-webpack-plugin для включения моделей вместо ссылок.
const slsw = require("serverless-webpack");
const nodeExternals = require("webpack-node-externals");
const CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports = {
entry: slsw.lib.entries,
target: "node",
// Since 'aws-sdk' is not compatible with webpack,
// we exclude all node dependencies
externals: [nodeExternals()],
// Run babel on all .js files and skip those in node_modules
module: {
rules: [
{
test: /\.js$/,
loader: "babel-loader",
include: __dirname,
exclude: /node_modules/
}
]
},
plugin: [
new CopyWebpackPlugin(filesToCopy, {})
]
};
убедитесь, что вы импортируете модели из правильной папки, так как вы импортируете по относительному пути. Это может измениться, если ваш пакет находится в другой папке.