Мне трудно заставить ReactJS и все его зависимости работать должным образом в среде AWS Elastic Beanstalk. В настоящее время я пытаюсь заставить Вавилон работать. Кажется, он не знает, куда он установил себя - в какую папку он входит. Например, вы должны иметь возможность использовать "@babel/preset-env"
для предустановленного имени, но я обнаружил, что мне нужно указать полный путь,"/opt/elasticbeanstalk/eb_infra/node_modules/@babel/preset-env"
, иначе он не сможет его найти. (Аналогично с другими пресетами / плагинами.)
Я получил большинство вещей в рабочем состоянии, используя этот подход, за исключением core-js. Кажется, он ищет в / tmp / свои модули. Странно, но я смог добавить символическую ссылку оттуда к ее фактическому местоположению. Но сейчас он не может найти core-js/modules/es.string.split
. Я посмотрел в папку реальных модулей и, конечно же, этот файл не существует.
Итак, мой вопрос: что это за файл es.string.split
(кроме очевидного - какой-нибудь полифилл для String.split), почему он не ищет, например, es6.string.split
(который также не существует)), почему он отсутствует и т. д. и т. д. Как мне заставить это работать.
Я получаю сообщение об ошибке:
[Application update [...]/Command 02_compress] : Activity execution failed, because: CommandError: An error occurred during rendering [...my_template].html: Error: Cannot find module 'core-js/modules/es.string.split' from '/tmp'
at /usr/lib/node_modules/browserify/node_modules/browser-resolve/node_modules/resolve/lib/async.js:46:17
at process (/usr/lib/node_modules/browserify/node_modules/browser-resolve/node_modules/resolve/lib/async.js:173:43)
at ondir (/usr/lib/node_modules/browserify/node_modules/browser-resolve/node_modules/resolve/lib/async.js:188:17)
at load (/usr/lib/node_modules/browserify/node_modules/browser-resolve/node_modules/resolve/lib/async.js:69:43)
at onex (/usr/lib/node_modules/browserify/node_modules/browser-resolve/node_modules/resolve/lib/async.js:92:31)
at /usr/lib/node_modules/browserify/node_modules/browser-resolve/node_modules/resolve/lib/async.js:22:47
at FSReqWrap.oncomplete (fs.js:153:21)
Установочный файл .ebextensions:
# approach taken from https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/instance-configuration/install-nodejs.config
files:
"/tmp/prep_node_installation.sh":
mode: "000755"
owner: root
group: root
content: |
#! /bin/bash
curl --silent --location https://rpm.nodesource.com/setup_10.x | bash -
"/tmp/install_node.sh":
mode: "000755"
owner: root
group: root
content: |
#! /bin/bash
yum -y install nodejs
"/tmp/install_npm.sh":
mode: "000755"
owner: root
group: root
content: |
#! /bin/bash
curl --silent --location http://npmjs.org/install.sh | sh
"/tmp/install_babel.sh":
mode: "000755"
owner: root
group: root
content: |
#! /bin/bash
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/preset-react @babel/plugin-proposal-class-properties
npm install --save core-js@3 @babel/polyfill
npm install -g browserify
# For some reason, core-js seems to be looking in /tmp/ for its files. So place a symbolic link from there to the actual folder that has the files.
ln -sf /opt/elasticbeanstalk/eb_infra/node_modules/@babel/polyfill/node_modules/core-js /tmp/core-js
commands:
05_prep_for_node_install:
command: "sh /tmp/prep_node_installation.sh"
ignoreErrors: false
10_install_node:
command: "sh /tmp/install_node.sh"
ignoreErrors: false
20_install_npm:
command: "sh /tmp/install_npm.sh"
ignoreErrors: false
30_install_babel:
command: "sh /tmp/install_babel.sh"
ignoreErrors: false
Файл Babel config.js:
const presets = [
[
// Because "@babel/preset-env" doesn't work...
"/opt/elasticbeanstalk/eb_infra/node_modules/@babel/preset-env",
{
targets: {
edge: "17",
firefox: "60",
chrome: "67",
safari: "11.1",
ie: "11",
},
useBuiltIns: "usage",
corejs: 3,
},
],
[
"/opt/elasticbeanstalk/eb_infra/node_modules/@babel/preset-react",
{}
],
];
const plugins = [
"/opt/elasticbeanstalk/eb_infra/node_modules/@babel/plugin-proposal-class-properties",
];
module.exports = { presets, plugins };
Мое приложение уже настроено на использование Django-Compressor, поэтому эта команда запускает Babel для подготовки к сжатию из settings.py:
_babel_executable = os.environ.get(
'BABEL_EXECUTABLE',
# Full path because it can't find the `babel` executable either
'/opt/elasticbeanstalk/eb_infra/node_modules/.bin/babel'
)
COMPRESS_PRECOMPILERS = [
('text/javascript',
('cat {infile} | %s -f {infile} > {outfile}.tmp;' % _babel_executable) +
'browserify {outfile}.tmp -o {outfile}'),
('text/jsx',
('cat {infile} | %s -f {infile} > {outfile}.tmp;' % _babel_executable) +
'browserify {outfile}.tmp -o {outfile}'),
]