Ser*_*kov 5 dependency-injection webpack angular
我遇到一个问题,当我使用 Webpack 构建项目时,Angular 依赖注入不起作用。
我使用Angular 13和Webpack 5,我使用@Injectable装饰器来标记服务类并将其传递给组件构造函数:
@Injectable({ providedIn: 'root'})
export class DITestService {
constructor() { }
getTitle(){
return "DI testing";
}
}
@Component({
selector: 'app-root',
template: '<div>Title: {{ title }}</div>'
})
export class AppComponent {
public title: string = this.diTestService.getTitle();
constructor(private diTestService: DITestService)
{ }
}
Run Code Online (Sandbox Code Playgroud)
当我运行该项目时,出现以下错误:
错误:此构造函数与 Angular 依赖注入不兼容,因为其参数列表索引 0 处的依赖项无效。如果依赖类型是像字符串这样的基元,或者此类的祖先缺少 Angular 装饰器,则可能会发生这种情况。
请检查 1) 索引 0 处的参数类型是否正确,以及 2) 为此类及其祖先定义了正确的 Angular 装饰器。
当我在没有 Webpack 的情况下通过 Angular CLI 运行同一个项目时,它工作得很好。
当我在组件构造函数中使用@Inject装饰器并使用 Webpack 构建项目时,它也可以正常工作。
constructor(@Inject(DITestService) private diTestService: DITestService)
Run Code Online (Sandbox Code Playgroud)
是否可以将 Webpack 配置为使用依赖注入而不使用@Inject装饰器?
我的测试项目的详细信息如下:
应用程序组件.ts
import { Component } from '@angular/core';
import { DITestService } from './ditest-service.service';
@Component({
selector: 'app-root',
template: '<div>Title: {{ title }}</div>'
})
export class AppComponent {
public title: string = this.diTestService.getTitle();
constructor(private diTestService: DITestService)
{ }
}
Run Code Online (Sandbox Code Playgroud)
ditest-service.service.ts
import { Injectable } from '@angular/core';
@Injectable({ providedIn: 'root'})
export class DITestService {
constructor() { }
getTitle(){
return "DI testing";
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序模块.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { DITestService } from './ditest-service.service';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule
],
providers: [DITestService],
bootstrap: [AppComponent]
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)
索引.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>AngularTest1</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<app-root></app-root>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
主要.ts
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
if (environment.production) {
enableProdMode();
}
platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.error(err));
Run Code Online (Sandbox Code Playgroud)
填充工具.ts
import 'zone.js';
Run Code Online (Sandbox Code Playgroud)
包.json
{
"name": "angular-test1",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"watch": "ng build --watch --configuration development",
"test": "ng test",
"webpack_serve": "webpack serve --mode development",
"webpack_build": "webpack --mode production"
},
"private": true,
"dependencies": {
"@angular/animations": "~13.0.0",
"@angular/common": "~13.0.0",
"@angular/compiler": "~13.0.0",
"@angular/core": "~13.0.0",
"@angular/forms": "~13.0.0",
"@angular/platform-browser": "~13.0.0",
"@angular/platform-browser-dynamic": "~13.0.0",
"@angular/router": "~13.0.0",
"rxjs": "~7.4.0",
"tslib": "^2.3.0",
"zone.js": "~0.11.4"
},
"devDependencies": {
"@angular-devkit/build-angular": "~13.0.4",
"@angular/cli": "~13.0.4",
"@angular/compiler-cli": "~13.0.0",
"@types/jasmine": "~3.10.0",
"@types/node": "^12.11.1",
"angular2-template-loader": "^0.6.2",
"html-webpack-plugin": "^5.5.0",
"jasmine-core": "~3.10.0",
"karma": "~6.3.0",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage": "~2.0.3",
"karma-jasmine": "~4.0.0",
"karma-jasmine-html-reporter": "~1.7.0",
"ts-loader": "^9.2.6",
"typescript": "~4.4.3",
"webpack": "^5.65.0",
"webpack-cli": "^4.9.1",
"webpack-dev-server": "^4.7.1"
}
}
Run Code Online (Sandbox Code Playgroud)
tsconfig.json
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist",
"forceConsistentCasingInFileNames": true,
"strict": false,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"sourceMap": true,
"declaration": false,
"downlevelIteration": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"moduleResolution": "node",
"importHelpers": true,
"target": "es2020",
"module": "es2020",
"lib": [
"es2020",
"dom"
]
},
"angularCompilerOptions": {
"enableI18nLegacyMessageIdFormat": false,
"strictInjectionParameters": false,
"strictInputAccessModifiers": true,
"strictTemplates": true
}
}
Run Code Online (Sandbox Code Playgroud)
webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: {
'polyfills': './src/polyfills.ts',
'app': './src/main.ts'
},
output:{
path: path.resolve(__dirname, 'dist'),
publicPath: '/',
filename: '[name].[fullhash].js'
},
devServer: {
historyApiFallback: true,
port: 40042,
open: false
},
resolve: {
extensions: ['.ts', '.js']
},
module:{
rules:[
{
test: /\.ts$/,
use: [
'ts-loader',
'angular2-template-loader'
]
}
]
},
plugins: [
new HtmlWebpackPlugin({
template: 'src/index.html'
})
]
}
Run Code Online (Sandbox Code Playgroud)
正如评论中所建议的:
使用 AngularCompilerPlugin 是可能的(它转换角度模板,并且一些转换也在 ts 类上完成)。
npmjs.com/package/@ngtools/webpack
| 归档时间: |
|
| 查看次数: |
995 次 |
| 最近记录: |