Вы один из тех людей, которые приступают к созданию крутого веб-сайта, а затем испытывают трудности с развертыванием в облаке?

Привет, я человек.

Недавно я создал действительно классное веб-приложение (привет Phoenix Project - веб-приложение запускается * скоро *)!

Это приложение Server-Side Rendered React (SSR), использующее мощь Razzle, инструмента, который предоставляет вам конфигурацию, необходимую для создания приложения SSR React.js. Что замечательно в Razzle, так это то, что он хорошо задокументирован сообществом технологов, приверженных поддержке проекта.

К сожалению, мне не удалось найти четких инструкций по развертыванию моего приложения Razzle в Google App Engine (GAE). Я собираюсь поделиться некоторыми своими ошибками при развертывании моего приложения.

Я не собираюсь здесь полностью воссоздавать колесо! Вы можете начать с обзора Краткое руководство по Google для приложений Node.js. Моя сборка в конечном итоге выглядела немного иначе, чем эта.

Это будет выглядеть примерно так:

Шаг 1. Добавьте свой app.yaml

В корне вашего каталога создайте файл app.yaml. Этот файл содержит конфигурацию, необходимую GAE для запуска вашего приложения. Вот мой.

runtime: custom
env: flex
manual_scaling:
  instances: 1
# resources:
#   cpu: 1
#   memory_gb: 1.5
#   disk_size_gb: 10
handlers:
- url: /
  static_files: build/index.html
  upload: build/index.html
- url: /
  static_dir: build
  http_headers:
    Access-Control-Allow-Origin: "*"
- url: /.*
  script: auto
  secure: always

Среда выполнения * custom * сообщает app.yaml искать соответствующий Dockerfile. В документах GAE указано, что nodejs будет использоваться для «времени выполнения», но у меня это не сработало. Проблема, с которой я постоянно сталкивался, заключалась в том, что проект некорректно собирал и запускал производственную версию при развертывании. Скорее, проект зависнет или не будет обслуживать ЛЮБЫЕ статические активы / javascript.

Шаг 2: добавляем докер

Это был секретный соус для меня. В корне вашего каталога создайте файл с именем Dockerfile. App.yaml будет ссылаться на этот файл при развертывании.

Вот мой:

FROM gcr.io/google_appengine/nodejs
WORKDIR /
ADD . .
RUN npm install
EXPOSE 5000
RUN npm run build
CMD ["npm", "run", "start:prod"]

Кикером здесь для меня было включение * RUN npm run build *. До добавления Docker мое приложение не собиралось в продакшене. И я не хотел запускать команду сборки локально, а затем напрямую отправлять этот файл сборки.

Шаг 3: razzle.config.js

Добавьте файл razzle.config.js в свой корневой каталог. Это отменяет конфигурацию starndar Razzle. Это произошло прямо из примера конфигурации поставщика, предоставленного Razzle.

'use strict';
module.exports = {
  modify(defaultConfig, { target, dev }, webpack) {
    const config = defaultConfig; // stay immutable here
// Change the name of the server output file in production
    if (target === 'web') {
      // modify filenaming to account for multiple entry files
      config.output.filename = dev
        ? 'static/js/[name].js'
        : 'static/js/[name].[hash:8].js';
// add another entry point called vendor
      config.entry.vendor = [
        require.resolve('react'),
        require.resolve('react-dom'),

      ];
config.optimization = {
        splitChunks: {
          cacheGroups: {
            vendor: {
              test: /[\\/]node_modules[\\/](react|react-dom)[\\/]/,
              name: 'vendor',
              chunks: 'all',
            }
          }
        }
      }
if (target === "node") {
       config.externals = []
     }
    // }
}
    return config;
  },
  module: {
      loaders: [
        {
          test: /\.jsx?$/,
          exclude: /node_modules/,
          loader: 'babel-loader'
        },
        {
          test: [/\.css$/, /\.scss$/],
          exclude: /node_modules/,
          loaders: ['style-loader', 'css-loader', 'sass-loader']
        }
      ]
    },
  resolve: {
      extensions: ['*', '.js', '.jsx']
    }
}

Вот и все! Это все, что вам нужно для развертывания приложения React в Google App Engine.

Но вот несколько дополнительных советов.

  1. При развертывании приложения помните, что оболочка файлов имеет значение. Например, если вы импортируете ‘../ A pp.css’ в ваш файл `App.js`, вам лучше подобрать регистр. Под этим я подразумеваю, что если вы импортируете `../ a pp.css` в свой файл, он будет работать локально, но взорвет ваше приложение в рабочей среде. Регистр файла и оператора импорта ДОЛЖЕН совпадать.
  2. Привыкайте к чтению журналов. В консоли GAE есть раздел «ведение журнала». Когда вас ударили о стену, определите, где именно произошла ошибка и почему. Кроме того, при развертывании включайте `verbosity = debug`. Это даст вам более подробную информацию при развертывании. Это был мой полный оператор развертывания: `gcloud app deploy - verbosity = debug - stop-previous-version - version = prod`

Этот пост вам вообще помог? Считаете, что любая тема заслуживает почетного упоминания или глубокого погружения? Позвольте мне знать в комментариях ниже!