Angular - 如何从产品构建中排除延迟加载的模块?
Angular - How to exclude a lazy loaded module from prod build?
我有一个用于演示目的的 angular 模块 (DevShowcaseModule)。此模块不应包含在生产构建中。为了对最终用户隐藏此演示,并防止在生产中出现演示代码错误。
环境:
- Angular版本:7.2.5
- Angular CLI:7.3.2
这是我的应用-routing.module.ts
{
path: APP_NAV_ITEMS.DEV_SHOWCASE,
canActivate: [ AuthGuard ],
loadChildren: './_dev-showcase/dev-showcase.module#DevShowcaseModule',
}
我试图从 tsconfig.json 中排除模块文件夹。但它不起作用,我仍然可以调用路由并加载演示模块。
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"importHelpers": true,
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
"module": "es2015",
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"target": "es5",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2018",
"dom"
]
},
"exclude": [
"app/_dev-showcase/*"
]
}
知道如何正确地做到这一点吗?
谢谢!
我认为您可以利用 CLI fileReplacements 功能,例如:
angular.json
"configurations": {
"production": {
"fileReplacements": [
...
{
"replace": "src/app/demo.routes.ts",
"with": "src/app/demo.routes.prod.ts"
}
],
demo.routes.ts
import { Routes } from '@angular/router';
export const demoRoutes: Routes = [
{
path: 'demo',
loadChildren: './demo/demo.module#DemoModule'
}
];
demo.routes.prod.ts
export const demoRoutes = [];
根路由器配置应如下所示:
import { demoRoutes } from './demo.routes';
RouterModule.forRoot([
{
path: '',
component: HomeComponent
},
...demoRoutes
])
使用此方法,cli 只会在开发模式下捆绑 DemoModule
。
这是另一种可能的解决方案。 PROD 模式运行良好。
唯一的缺点是,DemoModule 在 ng serve 之后没有加载。
它需要更改代码才能启动编译器,然后加载 DemoModule。
是否有机会在不更改代码的情况下加载延迟加载的 DemoModule?
if(!environment.production) {
console.log('Application is running in dev mode');
routes.unshift(
{
path: APP_NAV_ITEMS.DEV_SHOWCASE,
canActivate: [ AuthGuard ],
loadChildren: './_demo/demo.module#DemoModule',
},
)
}else{
console.log('Application is running in production mode');
}
@NgModule({
imports: [ RouterModule.forRoot(routes, { useHash: true }) ],
exports: [ RouterModule ]
})
export class AppRoutingModule {
}
我有一个用于演示目的的 angular 模块 (DevShowcaseModule)。此模块不应包含在生产构建中。为了对最终用户隐藏此演示,并防止在生产中出现演示代码错误。
环境:
- Angular版本:7.2.5
- Angular CLI:7.3.2
这是我的应用-routing.module.ts
{
path: APP_NAV_ITEMS.DEV_SHOWCASE,
canActivate: [ AuthGuard ],
loadChildren: './_dev-showcase/dev-showcase.module#DevShowcaseModule',
}
我试图从 tsconfig.json 中排除模块文件夹。但它不起作用,我仍然可以调用路由并加载演示模块。
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"importHelpers": true,
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
"module": "es2015",
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"target": "es5",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2018",
"dom"
]
},
"exclude": [
"app/_dev-showcase/*"
]
}
知道如何正确地做到这一点吗?
谢谢!
我认为您可以利用 CLI fileReplacements 功能,例如:
angular.json
"configurations": {
"production": {
"fileReplacements": [
...
{
"replace": "src/app/demo.routes.ts",
"with": "src/app/demo.routes.prod.ts"
}
],
demo.routes.ts
import { Routes } from '@angular/router';
export const demoRoutes: Routes = [
{
path: 'demo',
loadChildren: './demo/demo.module#DemoModule'
}
];
demo.routes.prod.ts
export const demoRoutes = [];
根路由器配置应如下所示:
import { demoRoutes } from './demo.routes';
RouterModule.forRoot([
{
path: '',
component: HomeComponent
},
...demoRoutes
])
使用此方法,cli 只会在开发模式下捆绑 DemoModule
。
这是另一种可能的解决方案。 PROD 模式运行良好。
唯一的缺点是,DemoModule 在 ng serve 之后没有加载。
它需要更改代码才能启动编译器,然后加载 DemoModule。
是否有机会在不更改代码的情况下加载延迟加载的 DemoModule?
if(!environment.production) {
console.log('Application is running in dev mode');
routes.unshift(
{
path: APP_NAV_ITEMS.DEV_SHOWCASE,
canActivate: [ AuthGuard ],
loadChildren: './_demo/demo.module#DemoModule',
},
)
}else{
console.log('Application is running in production mode');
}
@NgModule({
imports: [ RouterModule.forRoot(routes, { useHash: true }) ],
exports: [ RouterModule ]
})
export class AppRoutingModule {
}