在 Angular 项目中的生产构建中加载全局变量时出现问题
Problem with Loading Global Variable in Production Build In Angular Project
尝试从 js
文件加载环境以拥有动态环境,独立于基于 this article 的构建。
env.js
文件已添加到项目中,如下所示:
(function (window) {
window.__env = window.__env || {};
// API url
window.__env.apiUrl = 'http://dev.your-api.com';
// Whether or not to enable debug mode
// Setting this to false will disable console output
window.__env.enableDebug = true;
}(this));
然后我将脚本添加到 index.html 以加载 js 文件:
<script src="env.js"></script>
我这样使用全局变量:
console.log(window['__env']);
我为项目服务一切正常,我构建项目(使用 ng build
进行常规构建)一切都很好,
但是当我使用 ng build --prod
构建时,全局变量为空,
如何告诉 webpack 有一个全局变量,你应该在不使用服务的情况下将其引入?
有什么想法吗?
我使用一个JSON文件读取环境动态构建独立:
这一行Load env.json in AppModule inside APP_Initilizer:
export function init_app(appLoadService: AppInitService) {
return () => appLoadService.init("assets/env.json");
}
注意:不要忘记提供部分:
providers: [
EnvServiceProvider,
AppInitService,
AuthenticationService,
// TabGuard,
{
provide: APP_INITIALIZER,
useFactory: init_app,
deps: [AppInitService],
multi: true,
}
// ...
]
AppInitService:
@Injectable({
providedIn: 'root'
})
export class AppInitService {
// This is the method you want to call at bootstrap
// Important: It should return a Promise
public init(path:string) {
return from(
fetch(path).then(function(response) {
return response.json();
})
).pipe(
map((config) => {
window['__env'] = config;
return
})).toPromise();
}
}
然后使用环境提供商提供envs:
import { EnvService } from './env.service';
export const EnvServiceFactory = () => {
// Create env
const env = new EnvService();
// Read environment variables from browser window
const browserWindow = window || {};
const browserWindowEnv = browserWindow['__env'] || {};
// Assign environment variables from browser window to env
// In the current implementation, properties from env.js overwrite defaults from the EnvService.
// If needed, a deep merge can be performed here to merge properties instead of overwriting them.
for (const key in browserWindowEnv) {
if (browserWindowEnv.hasOwnProperty(key)) {
env[key] = window['__env'][key];
}
}
return env;
};
export const EnvServiceProvider = {
provide: EnvService,
useFactory: EnvServiceFactory,
deps: [],
};
像这样使用 env 提供程序:
env: any;
constructor(
public envService: EnvService
) {
this.env = this.envService;
}
尝试从 js
文件加载环境以拥有动态环境,独立于基于 this article 的构建。
env.js
文件已添加到项目中,如下所示:
(function (window) {
window.__env = window.__env || {};
// API url
window.__env.apiUrl = 'http://dev.your-api.com';
// Whether or not to enable debug mode
// Setting this to false will disable console output
window.__env.enableDebug = true;
}(this));
然后我将脚本添加到 index.html 以加载 js 文件:
<script src="env.js"></script>
我这样使用全局变量:
console.log(window['__env']);
我为项目服务一切正常,我构建项目(使用 ng build
进行常规构建)一切都很好,
但是当我使用 ng build --prod
构建时,全局变量为空,
如何告诉 webpack 有一个全局变量,你应该在不使用服务的情况下将其引入?
有什么想法吗?
我使用一个JSON文件读取环境动态构建独立:
这一行Load env.json in AppModule inside APP_Initilizer:
export function init_app(appLoadService: AppInitService) {
return () => appLoadService.init("assets/env.json");
}
注意:不要忘记提供部分:
providers: [
EnvServiceProvider,
AppInitService,
AuthenticationService,
// TabGuard,
{
provide: APP_INITIALIZER,
useFactory: init_app,
deps: [AppInitService],
multi: true,
}
// ...
]
AppInitService:
@Injectable({
providedIn: 'root'
})
export class AppInitService {
// This is the method you want to call at bootstrap
// Important: It should return a Promise
public init(path:string) {
return from(
fetch(path).then(function(response) {
return response.json();
})
).pipe(
map((config) => {
window['__env'] = config;
return
})).toPromise();
}
}
然后使用环境提供商提供envs:
import { EnvService } from './env.service';
export const EnvServiceFactory = () => {
// Create env
const env = new EnvService();
// Read environment variables from browser window
const browserWindow = window || {};
const browserWindowEnv = browserWindow['__env'] || {};
// Assign environment variables from browser window to env
// In the current implementation, properties from env.js overwrite defaults from the EnvService.
// If needed, a deep merge can be performed here to merge properties instead of overwriting them.
for (const key in browserWindowEnv) {
if (browserWindowEnv.hasOwnProperty(key)) {
env[key] = window['__env'][key];
}
}
return env;
};
export const EnvServiceProvider = {
provide: EnvService,
useFactory: EnvServiceFactory,
deps: [],
};
像这样使用 env 提供程序:
env: any;
constructor(
public envService: EnvService
) {
this.env = this.envService;
}