Привет,
Спасибо за отличное репо!
Меня беспокоит использование babel-register на сервере.
Согласно документации babel , его нельзя использовать в производстве.
Обратите внимание, что это не предназначено для производственного использования. Считается плохой практикой развертывать код, который компилируется таким образом. Гораздо лучше заранее скомпилировать перед развертыванием.
Есть ли план решения этой проблемы?
Мы могли бы скомпилировать всю папку src
в build
? Сделал быстрый тест, и вот что я придумал:
"start:prod": "npm run build:server && npm run build && NODE_ENV=production node ./build/server/server.js",
"build:server": "babel src --out-dir build",
Я заменил скрипты npm
и вроде работает. Я уверен, что есть лучшие решения.
Потребуется использовать веб-пакет на сервере
В настоящее время пробую это http://jlongster.com/Backend-Apps-with-Webpack--Part-I
Сделаю пиар, когда все заработает. 👍
Проблема в том, что на сервере нет HMR, даже с подходом jlongster. 😦
Как насчет того, чтобы ограничиться только производством?
Это выглядело бы примерно так:
// webpack.server.prod.config.js
var webpack = require('webpack')
var fs = require('fs')
var path = require('path')
module.exports = {
target: 'node',
devtool: 'inline-source-map',
entry: path.join(__dirname, 'app.js'),
output: {
filename: path.join(__dirname, 'app.bundle.js')
},
// keep node_module paths out of the bundle keep size down
externals: getExternals(),
node: {
__filename: true,
__dirname: true
},
module: {
loaders: [
{ test: /\.js$/, loader: 'babel-loader' } // handwaiving here
]
},
plugins: [
new webpack.BannerPlugin(
'require("source-map-support").install();',
{ raw: true, entryOnly: false }
)
]
}
function getExternals() {
const nodeModules = fs.readdirSync(path.resolve(__dirname, 'node_modules'))
return nodeModules.reduce((ext, mod) => {
ext[mod] = 'commonjs ' + mod
return ext
}, {})
}
Спасибо за быстрый ответ! Итак, в основном после использования этой конфигурации нам нужно изменить start:prod
script, чтобы использовать app.bundle.js
верно?
Другой вопрос о запуске в производстве, в настоящее время команда start:prod
использует node
для запуска сервера.
Разве мы не должны использовать что-то вроде PM2 для запуска сервера на производстве?
Значит, он будет автоматически перезапускаться при изменении кода и масштабироваться на все ядра?
PM2 - это много накладных расходов. Мы используем Throng в производстве. Но да, мы можем внести это изменение.
Привет, народ,
Похоже, нам все еще нужны node_modules
в производстве? Развертывание только папки / build вызывает ошибку, связанную с babel, поэтому мне интересно, не связана ли эта проблема. Кто-нибудь придумал что-то подобное?
При выполнении node ./build/server.js
с использованием только папки / build:
Error: Cannot find module 'babel-runtime/core-js/json/stringify'
Спасибо!
Изменить: переформулировать мой вопрос: почему нам все еще нужен node_modules
в производстве, даже если весь код связан с Webpack? Разве все необходимое для производства не должно находиться в папке / build?
Вам не нужны модули Node в продукте
Привет, Джаред,
Спасибо за Ваш ответ :)
Я тоже этого ожидал! Итак, я протестировал новую установку с examples/basic
и выполнил следующий процесс:
cd examples/basic
npm install
npm run build
rm -rf node_modules
npm run start:prod
а затем он терпит неудачу:
Error: Cannot find module 'express'
Открывать новый выпуск или я что-то не так делаю?
Для потомков:
Насколько я понимаю, конфигурация Webpack для бэкэнда использует webpack-node-externals
как показано в этой строке, поэтому node_modules
не входят в комплект бэкэнда. Это означает, что node_modules
требуются для производства и должны быть развернуты вместе с папкой /build
.
Привет @Grsmto!
Можете ли вы решить проблему? Создать приложение razzle с include node_modules?
Для меня нехорошо копировать все файлы из каталога node_modules в продакшн.
Привет @krystianjj!
Мне пришлось скопировать папку node_modules на производственный сервер или создать приложение прямо на производственном сервере. к сожалению, я не нашел способа развернуть только папку /build
.
Спасибо за быстрый ответ @Grsmto
Я делаю то же самое - копирую package.json на производственный сервер, запускаю npm install, и у меня есть папка сборки с node_modules.
Возможно, @jaredpalmer в будущем добавит исправление для этого, или это хорошее решение для копирования node_modules на сервер.
У кого-нибудь это работает, я не хочу брать node_modules на рабочий сервер после создания пакета.
Хорошо, исправили эту проблему каким-то образом.
Нам нужно добавить это в razzle.config
.
module.exports = {
modify: (config, { target, dev }) => {
if(target === "node") {
config = {
...config,
externals: []
}
}
return config;
}
}
Чтобы эта работа в вашем конвейере CI, вам нужно сделать process.env.CI
ложным.
Потому что, если переменная среды CI
истинна, предупреждения рассматриваются как ошибки, и ваша сборка завершится ошибкой. Почему это спросите вы? Из-за проблемы с явной зависимостью
./node_modules/express/lib/view.js
Critical dependency: the request of a dependency is an expression
Самый полезный комментарий
Хорошо, исправили эту проблему каким-то образом.
Нам нужно добавить это в
razzle.config
.Чтобы эта работа в вашем конвейере CI, вам нужно сделать
process.env.CI
ложным.Потому что, если переменная среды
CI
истинна, предупреждения рассматриваются как ошибки, и ваша сборка завершится ошибкой. Почему это спросите вы? Из-за проблемы с явной зависимостью