Angular Universal: Нужно ли устанавливать на сервер пакеты npm? - PullRequest
0 голосов
/ 01 мая 2018

Если я создаю простое приложение Angular (например, с Angular CLI), сборка помещает весь Javascript в несколько пакетов. Эти пакеты содержат весь мой пользовательский код, а также код пакетов npm, от которых зависит мое приложение (например, Angular Core, момент).

Теперь я использую Universal для предварительной визуализации моего углового приложения. Процесс сборки создает файл main.bundle.js, который является ссылкой в ​​server.js (https://angular.io/guide/universal). Правильно ли, что этот пакет не содержит код упомянутых пакетов npm? Мне нужно установить все это пакеты на сервере, где я снова запускаю свой универсал?

ИЛИ Я просто что-то делаю не так?

Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Вам необходимо установить пакеты npm для рендеринга на стороне сервера на сервере, на котором вы выполняете рендеринг или предварительного рендеринга (оба они разные ). Из того, что вы сказали, вы хотите использовать предварительный рендеринг. В этом случае вам необходимо установить требуемые пакеты npm на сервере, где вы будете предварительно генерировать HTML-страницы (например, это может быть ваш промежуточный сервер).

npm install --save @angular/platform-server @nguniversal/module-map-ngfactory-loader ts-loader @nguniversal/express-engine

После того как вы предварительно представили все страницы, вам необходимо скопировать эти страницы (а также файлы js, которые были впервые созданы при создании приложения) на рабочий сервер. Оттуда вы можете обслуживать эти страницы любым веб-сервером, который вам нужен (nginx, apache, express, ..), так как это все статическое (html / js) содержимое. Вам не нужны пакеты npm или даже узел здесь (кроме случаев, когда вы хотите обслуживать их с помощью экспресс)

В противном случае, если вы хотите использовать рендеринг на лету, то да, вам понадобятся пакеты express и npm на производственном сервере

0 голосов
/ 10 мая 2018

Сгенерировано dist/server/main.js содержит ссылки на все пакеты Node, используемые вашим приложением. Если вы запустите экспресс-сервер без , передавая его через веб-пакет - тогда да. Вам потребуется установить пакеты npm.

Но если вы создадите файл .ts сервера и предоставите его в веб-пакете для переноса через webpack --config webpack.server.config.js из руководства, то вы получите обычно огромный dist/server.js файл, сгенерированный

Этот файл содержит все ваши зависимости, объединенные в один файл, и поэтому не нужно пакеты для присутствия. Выполнение node dist/server запустит ваше приложение, и оно будет автономным. То есть Вы можете удалить все, кроме папки dist, и она будет работать.

0 голосов
/ 03 мая 2018

Я могу подтвердить, что это не так. Вам не нужно устанавливать пакеты npm для запуска сервера. main.bundle.js содержит все, что требуется. Например, вот Dockerfile, который строит проект Angular за один этап, а на следующем этапе он запускает сервер. Здесь пакеты npm устанавливаются только на этапе сборки. На следующем этапе, на котором запускается сервер, просто копируется папка dist и устанавливается пакет no npm.

FROM node:8.10.0 AS ausbuilder
RUN useradd --create-home --shell /bin/bash aus; \
    chown -R aus /home/aus
USER aus
WORKDIR /home/aus
COPY aus/ /home/aus
RUN mkdir /home/aus/.npm; \
    npm config set prefix /home/aus/.npm; \
    npm install --quiet --no-progress -g webpack@3.11.0; \
    npm install --quiet --no-progress -g @angular/cli@1.7.2; \
    npm install --quiet --no-progress;
ENV PATH=/home/aus/.npm/bin:$PATH
RUN npm run build; \
    webpack --config webpack.server.config.js --no-progress

FROM keymetrics/pm2:8-alpine
RUN adduser -h /home/aus -s /bin/bash aus; \
    chown -R aus /home/aus
USER aus
WORKDIR /home/aus
COPY --from=ausbuilder /home/aus/dist /home/aus/dist
EXPOSE 4000/tcp
ENTRYPOINT ["pm2-runtime","start","/home/aus/dist/server.js"]
...