angular - JHipster - Create a new Angular Front End Environment
问题描述
I have deployed on a NGnix server a JHipster (6.10.1) generated Angular FrontEnd. I would like to deploy this FrontEnd relying on some specific environment configuration(dev, prod, staging, etc.)
I know it is possible with Angular to customize the configuration by using/creating some files like :
- environment.dev.ts
- environment.prod.ts
- environment.staging.ts
and using the ng build --configuration=staging
What kind of parameters should I add in the package.json file to select the correct environment using a npm run build:<ENV>
command?
Regards...
UPDATE 08/09
Thank you millenion, I would like to use only native Angular solution as you've described. Unfortunately, as I use JHipser, it would be better that I just extend what does already exist instead of creating a different way to deploy others environments. That means it would be better to have counterpart solution to the existing ones, based on webpack.
Nonetheless, all the necessary modifications (that you've described) in the angular.json file had already been done. There are many plugins and loaders in the webpack.common.js and in the webpack.prod.js that I would like to be used while deploying in lower environments.
For example there are the kind of plugins in the webpack.common.js :
plugins: [
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: `'${options.env}'`,
BUILD_TIMESTAMP: `'${new Date().getTime()}'`,
// APP_VERSION is passed as an environment variable from the Gradle / Maven build tasks.
VERSION: `'${process.env.hasOwnProperty('APP_VERSION') ? process.env.APP_VERSION : 'DEV'}'`,
DEBUG_INFO_ENABLED: options.env === 'development',
// The root URL for API calls, ending with a '/' - for example: `"https://www.jhipster.tech:8081/myservice/"`.
// If this URL is left empty (""), then it will be relative to the current context.
// If you use an API server, in `prod` mode, you will need to enable CORS
// (see the `jhipster.cors` common JHipster property in the `application-*.yml` configurations)
SERVER_API_URL: `''`
}
}),
new CopyWebpackPlugin([
{ from: './node_modules/swagger-ui-dist/*.{js,css,html,png}', to: 'swagger-ui', flatten: true, ignore: ['index.html'] },
{ from: './node_modules/axios/dist/axios.min.js', to: 'swagger-ui' },
{ from: './src/main/webapp/swagger-ui/', to: 'swagger-ui' },
{ from: './src/main/webapp/content/', to: 'content' },
{ from: './src/main/webapp/favicon.ico', to: 'favicon.ico' },
{ from: './src/main/webapp/manifest.webapp', to: 'manifest.webapp' },
// jhipster-needle-add-assets-to-webpack - JHipster will add/remove third-party resources in this array
{ from: './src/main/webapp/robots.txt', to: 'robots.txt' }
]),
new HtmlWebpackPlugin({
template: './src/main/webapp/index.html',
chunks: ['polyfills', 'main', 'global'],
chunksSortMode: 'manual',
inject: 'body'
}),
new BaseHrefWebpackPlugin({ baseHref: '/' }),
new AngularCompilerPlugin{
mainPath: utils.root('src/main/webapp/app/app.main.ts'),
tsConfigPath: utils.root('tsconfig.app.json'),
sourceMap: true
})
]
The interesting plugins are DefinePlugin and AngularCompilerPlugin
To deploy an Angular app, relying on webpack and some specific configurations, I guess I need to load some variables took from the environment.<env_name>.ts file, send them to the DefinePlugin which feeds the AngularCompilerPlugin plugin.
There are the scripts located in the package.json file :
"scripts": {
"prettier:format": "prettier --write \"{,src/**/}*.{md,json,ts,css,scss,yml}\"",
"lint": "eslint . --ext .js,.ts",
"lint:fix": "npm run lint -- --fix",
"ngc": "ngc -p tsconfig.app.json",
"cleanup": "rimraf target/classes/static/ target/classes/aot",
"clean-www": "rimraf target/classes/static/app/{src,target/}",
"start": "npm run webpack:dev",
"start-tls": "npm run webpack:dev -- --env.tls",
"serve": "npm run start",
"build": "npm run webpack:prod",
"test": "npm run lint && jest --coverage --logHeapUsage -w=2 --config src/test/javascript/jest.conf.js",
"test:watch": "npm run test -- --watch",
"webpack:dev": "npm run webpack-dev-server -- --config webpack/webpack.dev.js --inline --hot --port=9060 --watch-content-base --env.stats=minimal",
"webpack:dev-verbose": "npm run webpack-dev-server -- --config webpack/webpack.dev.js --inline --hot --port=9060 --watch-content-base --profile --progress --env.stats=normal",
"webpack:build:main": "npm run webpack -- --config webpack/webpack.dev.js --env.stats=minimal",
"webpack:build": "npm run cleanup && npm run webpack:build:main",
"webpack:prod:main": "npm run webpack -- --config webpack/webpack.prod.js --profile",
"webpack:prod": "npm run cleanup && npm run webpack:prod:main && npm run clean-www",
"webpack:test": "npm run test",
"webpack-dev-server": "node --max_old_space_size=4096 node_modules/webpack-dev-server/bin/webpack-dev-server.js",
"webpack": "node --max_old_space_size=4096 node_modules/webpack/bin/webpack.js"
}
Finally, the question, is most likely : How can I pass parameters in such a way the following command :
npm run webpack:staging:main
deploys the app with the staging environment configuration?
Fred
解决方案
您可以通过在 angular.json 文件中添加适当的配置来做到这一点。
在您的情况下,您可能希望在角度示意图中添加一个新块并添加如下内容:
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.staging.ts"
}
],
对于您的新环境,我建议将其基于“生产”或“开发”块,具体取决于您期望的行为。传递参数时要小心:
npm run build -- --staging
关于你的 package.json,我通常使用两个选项:outputPath 和 deleteOutputPath。第二个很高兴获得一个干净的目录。这不是必需的,但很方便:
"build:staging": "ng build --staging --outputPath=YourOutputPath --deleteOutputPath=true",
这样你就可以这样做:
npm run build:staging
如果您想将 SSR 添加到您的项目中,这将需要更多的工作,尽管它比当时容易得多。
完整的文档可能会有所帮助 => https://angular.io/cli/build
推荐阅读
- matlab - 在matlab中使用\求解稀疏矩阵
- google-tag-manager - 关于添加 GTM 事件跟踪的最佳方法是什么的问题
- javascript - Webpack CommonsChunkPlugin 迁移,带有 2 个命名的公共块,50 多个条目
- python-3.x - 输入错误时如何使消息框显示?
- gradle - 无法解析配置“:url_launcher:lintClassPath”的所有文件
- javascript - 我怎样才能从这个购物车中删除一个项目?
- c# - 不包含“书籍”的定义
- android - onBindViewHolder 直到滚动才被调用
- java - MapDB 列表类型?
- python - 如何在熊猫中为每个组做前向填充