如果我创建一个普通的Angular应用程序(例如使用Angular CLI),那么构建会将所有Javascript放在一些包中。这些包包含我的所有自定义代码以及我的应用程序所依赖的npm包的代码(例如Angular core,moment)。
现在我正在使用Universal来预渲染我的角度应用程序。构建过程创建一个main.bundle.js,它是server.js(https://angular.io/guide/universal)中的引用。是不是,这个包不包含引用的npm包的代码?我必须在服务器上安装所有这些软件包,我再次运行我的Universal?
或者我只是做错了什么?
非常感谢。
答案 0 :(得分:0)
我可以确认这不是真的。您无需安装npm软件包即可运行服务器。 main.bundle.js
包含所有必需的内容。例如,这里有一个Dockerfile,它在一个阶段构建Angular项目,在下一个阶段运行服务器。这里,npm包仅在构建阶段安装。在运行服务器的下一个阶段,只需复制dist文件夹并安装否 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"]
答案 1 :(得分:0)
您需要在执行呈现或预呈现的服务器上安装服务器端呈现的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提供服务)
否则,如果你想在飞行渲染中使用,那么你需要在生产服务器上使用express和npm包
答案 2 :(得分:0)
生成的dist/server/main.js
包含对您的应用使用的所有Node包的引用。如果您将触发快速服务器而不是通过webpack进行转换 - 那么是。您将需要安装npm软件包。
但是,如果您要创建服务器 .ts 文件并将其提供给webpack,以便通过指南中的webpack --config webpack.server.config.js
进行转换,那么您通常会获得巨大的dist/server.js
文件生成< / p>
此文件包含合并到单个文件中的所有依赖项,因此不会需要包存在。执行node dist/server
将启动您的应用程序并且它是自包含的。即你可以删除dist
文件夹以外的任何内容,它会起作用。