Angular应用程序在达到生产阶段后,如何进行部署?
到目前为止,我看到的所有指南(甚至在angular.io上)都依靠lite-server提供服务和browserSync反映更改 - 但是当您完成开发之后,如何发布应用程序?
我是否应该在index.html
页面上导入所有编译好的.js
文件,还是使用gulp进行缩小?它们会工作吗?在生产版本中是否需要SystemJS?
Angular应用程序在达到生产阶段后,如何进行部署?
到目前为止,我看到的所有指南(甚至在angular.io上)都依靠lite-server提供服务和browserSync反映更改 - 但是当您完成开发之后,如何发布应用程序?
我是否应该在index.html
页面上导入所有编译好的.js
文件,还是使用gulp进行缩小?它们会工作吗?在生产版本中是否需要SystemJS?
简单回答。使用Angular CLI并输入以下命令:
ng build
在您的项目根目录下运行该命令。网站将在dist目录中创建,并且您可以将其部署到任何Web服务器。
如果您的应用程序中有生产设置,则应使用此选项来进行构建测试。
ng build --configuration production
这将在dist
目录中构建项目,可以将其推送到服务器。
自我发布此答案以来,已经发生了很多事情。CLI终于达到1.0.0版本,在按照此指南进行升级之前,请确保你的项目已经完成了升级。https://github.com/angular/angular-cli/wiki/stories-rc-update
您实际上正在触及两个问题。
第一个问题是如何托管您的应用程序?
正如@toskv所提到的,这是一个非常广泛的问题,需要考虑许多不同的事情。
第二个问题是如何准备应用程序的部署版本?
您有几个选项:
使用特殊的打包工具,如webpack
或systemjs
构建器。
它们具备#1中缺乏的所有可能性。
您可以将所有应用程序代码打包成只有几个js/css/...文件,在HTML中引用这些文件。 systemjs
构建器甚至允许您摆脱将systemjs
作为部署包的一部分的需要。
您可以使用自Angular 8以来的ng deploy
从CLI部署您的应用程序。 ng deploy
将需要与您选择的平台(例如@angular/fire
)配合使用。您可以查看官方文档以了解最适合您的内容这里
是的,您很可能需要部署systemjs
和许多其他外部库作为包的一部分。 是的,您将能够将它们捆绑成只有几个js文件,并从HTML页面引用它们。
您不必从页面引用所有编译好的js文件 - systemjs
作为一个模块加载器会处理这个问题。
我知道听起来很复杂 - 为了帮助您开始进行#2,这里提供两个非常好的示例应用程序:
SystemJS构建器: Angular2种子
WebPack: Angular2 WebPack起始器
node_modules
中的依赖项。请注意——您应该仅复制程序运行所需的依赖项。不要复制仅用于开发的依赖项(例如 gulp/grunt 等)。 - Amid创建Heroku帐户并安装CLI。
将angular-cli
依赖项移动到package.json
中的dependencies
(这样当您推送到Heroku时它会被安装)。
添加一个postinstall
脚本,当代码被推送到Heroku时运行ng build
。还要为接下来创建的Node服务器添加一个启动命令。这将在服务器上将应用程序的静态文件放置在dist
目录中,并在之后启动应用程序。
"scripts": {
// ...
"start": "node server.js",
"postinstall": "ng build --aot -prod"
}
// server.js
const express = require('express');
const app = express();
// Run the app by serving the static files
// in the dist directory
app.use(express.static(__dirname + '/dist'));
// Start the app by listening on the default
// Heroku port
app.listen(process.env.PORT || 8080);
heroku create
git add .
git commit -m "first deploy"
git push heroku master
这里是我写的一个快速入门,涉及更多细节,包括如何强制使用HTTPS以及如何处理PathLocationStrategy
。如果需要,请查看此文。
我使用 forever:
ng build --prod --output-path ./dist
在你的 Angular 应用路径下创建 server.js 文件:
const express = require('express');
const path = require('path');
const app = express();
app.use(express.static(__dirname + '/dist'));
app.get('/*', function(req,res) {
res.sendFile(path.join(__dirname + '/dist/index.html'));
});
app.listen(80);
永久启动 forever start server.js
就这些!您的应用程序现在应该正在运行中!
var express = require('express'),
path = require('path'),
fs = require('fs');
var app = express();
var staticRoot = __dirname + '/';
app.set('port', (process.env.PORT || 3000));
app.use(express.static(staticRoot));
app.use(function(req, res, next){
// if the request is not html then move along
var accept = req.accepts('html', 'json', 'xml');
if(accept !== 'html'){
return next();
}
// if the request has a '.' assume that it's for a file, move along
var ext = path.extname(req.path);
if (ext !== ''){
return next();
}
fs.createReadStream(staticRoot + 'index.html').pipe(res);
});
app.listen(app.get('port'), function() {
console.log('app running on port', app.get('port'));
});
还需在您的package.json文件中添加express依赖。
然后在您喜欢的环境上部署它。
我为在IIS上部署提供了一个小博客。请点击链接
如果你和我一样在本地测试应用程序,或者你遇到了空白白屏幕的问题,我会使用以下方法:
ng build --prod --build-optimizer --base-href="http://127.0.0.1/my-app/"
解释:
ng build
构建应用程序时,代码中可能会存在许多空格、制表符和其他使代码易于阅读的内容。对于服务器而言,代码的外观并不重要。这就是为什么我使用以下方法:
ng build --prod --build-optimizer
这可以将代码打包为生产环境,并减小大小 [--build-optimizer
],从而使更多的代码变小。
所以最后我添加了 --base-href="http://127.0.0.1/my-app/"
来告诉应用程序主框架在哪里 [简单来说]。使用它,您甚至可以在任何文件夹中拥有多个Angular应用程序。
希望这可以帮到您,也希望我能在本周尝试这个。
Can't resolve 'node-uuid' in path\azure-deploy\lib
这样的错误。这仍然可能吗?我已经在app.module
中配置了第5步,但我不确定我是否正确执行了第3和第4步。您能澄清一下吗? - Wouter Vanherck在IIS中部署你的应用程序,按以下步骤操作:
步骤1:使用命令ng build --prod构建你的Angular应用程序。
步骤2:构建后,所有文件存储在应用程序路径的dist文件夹中。
步骤3:在C:\inetpub\wwwroot文件夹下创建一个名为QRCode的文件夹。
步骤4:将dist文件夹的内容复制到C:\inetpub\wwwroot\QRCode文件夹中。
步骤5:使用命令(Window + R)打开IIS Manager,并输入inetmgr,点击OK。
步骤6:右键单击“Default Web Site”,然后单击Add Application。
步骤7:输入别名'QRCode',并将物理路径设置为C:\inetpub\wwwroot\QRCode。
步骤8:打开index.html文件,找到href="\"行,并删除'\'。
步骤9:现在可以在任何浏览器中浏览应用程序了。
你也可以观看视频以获得更好的理解。
ng build --prod --env=prod
步骤 2:
复制 dist 文件夹到服务器,并将其部署到服务器的根目录中。
步骤 3:
在根目录中创建 .htaccess
文件,并将以下内容粘贴到其中。 <IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>