Angular 2 - Webpack 2 - 模板加载器不能与 templateUrl 一起工作
Angular 2 - Webpack 2 - template-loader not working with templateUrl
我为我的应用程序创建了一个最小的 webpack 示例,我尝试将 templateUrl 与“./file.name.html”一起使用以进行编译。但是我的应用程序唯一显示的是索引页面上 templateUrl 的名称“./file.name.html”。应用程序似乎可以正常工作,因为控制台和
中没有错误
<app>... Loading </app>
不再显示。在我尝试使用 webpack 之前,我使用过 systemJs 并且我的应用程序运行良好。所以我认为这不是应用程序问题。
我的起始文件名是boot.ts
/// <reference path="../typings/index.d.ts" />
import 'core-js/es6';
import 'core-js/es7/reflect';
import "zone.js/dist/zone";
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule);
app.component 定义看起来像
.... Imports
@Component({
selector: 'sxp-app',
templateUrl: "./app.component.html"
})
export class AppComponent { ... }
我的webpack.config.js
var path = require('path');
module.exports = {
entry: "./App/boot.ts",
output: {
path: path.join(__dirname, './Scripts/dist'),
filename: "bundle.js"
},
resolve: {
extensions: ['.ts', '.js']
},
module: {
loaders: [
{
test: /\.ts$/,
loader: ['awesome-typescript-loader', 'angular2-template-loader']
},
{
test: /\.html$/,
loader: 'raw-loader'
}
]
}
};
package.json
{
"scripts": {
"start": "webpack-dev-server --inline --progress --port 8080",
"build": "rimraf dist && webpack --config config/webpack.prod.js --progress --profile --bail"
},
"dependencies": {
"@angular/common": "~2.2.0",
"@angular/compiler": "~2.2.0",
"@angular/core": "~2.2.0",
"@angular/forms": "~2.2.0",
"@angular/http": "~2.2.0",
"@angular/platform-browser": "~2.2.0",
"@angular/platform-browser-dynamic": "~2.2.0",
"@angularclass/hmr": "~1.2.2",
"@angularclass/hmr-loader": "~3.0.2",
"@angular/router": "~3.2.0",
"@angular/upgrade": "~2.2.0",
"core-js": "^2.4.1",
"rxjs": "5.0.0-beta.12",
"zone.js": "^0.6.26",
"ui-router-ng2": "1.0.0-beta.3"
},
"devDependencies": {
"@types/node": "^6.0.51",
"@types/requirejs": "2.3.1",
"angular2-router-loader": "^0.3.4",
"angular2-template-loader": "^0.6.0",
"css-loader": "0.26.0",
"file-loader": "0.9.0",
"html-loader": "0.4.4",
"html-webpack-plugin": "2.24.1",
"raw-loader": "0.5.1",
"rimraf": "~2.5.4",
"style-loader": "0.13.1",
"typescript": "^2.0.10",
"typings": "2.0.0",
"webpack": "2.1.0-beta.27",
"webpack-dev-server": "2.1.0-beta.12",
"webpack-merge": "0.17.0",
"webpack-notifier": "^1.4.1"
}
}
和tsconfig.json
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false,
"types": [
"node"
]
},
"awesomeTypescriptLoaderOptions": {
"useWebpackText": true
},
"exclude": [
"node_modules",
"dist",
"typings/main",
"typings/index.d.ts"
],
"compileOnSave": true
}
我正在使用 Ui-router,我看到加载了正确的 url,但它只显示模板文件名,如“./appHeader.component.html”,但没有模板。
您需要使用 template: require("./app.component.html")
而不是 templateUrl:"..."
才能使其正常工作。
Webpack 扫描您的文件并搜索例如需要(...)标签。
我找到了我的问题!
不要像
这样使用 ES6 引号
templateUrl: \`./app.component.html`
这将在您的应用程序中只呈现“./app.component.html”
使用正常的引号,如下所示:
templateUrl: './app.component.html'
templateUrl: "./app.component.html"
这不起作用的另一个原因是如果您已经编译了与您的 .ts
文件相对应的 .js
文件。一些 IDE 会在您保存或编译时自行创建这些。
这有这样的效果,当请求 'module' 时,它首先找到 .js
文件并且根本不处理 .ts
文件 - 所以它不会去通过这个 'chain'.
编辑您的 .csproj
文件并将其添加为新的 属性 组(首先搜索它尚不存在)。这将防止 Visual Studio 在保存时自动生成 .js
文件。
<PropertyGroup>
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
</PropertyGroup>
确保删除所有生成的 .js
和 .js.map
文件,这些文件在您的 ClientApp
文件夹(组件等)下具有相应的 .ts
文件。首先检查源代码控制/备份以防万一。
我为我的应用程序创建了一个最小的 webpack 示例,我尝试将 templateUrl 与“./file.name.html”一起使用以进行编译。但是我的应用程序唯一显示的是索引页面上 templateUrl 的名称“./file.name.html”。应用程序似乎可以正常工作,因为控制台和
中没有错误<app>... Loading </app>
不再显示。在我尝试使用 webpack 之前,我使用过 systemJs 并且我的应用程序运行良好。所以我认为这不是应用程序问题。
我的起始文件名是boot.ts
/// <reference path="../typings/index.d.ts" />
import 'core-js/es6';
import 'core-js/es7/reflect';
import "zone.js/dist/zone";
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule);
app.component 定义看起来像
.... Imports
@Component({
selector: 'sxp-app',
templateUrl: "./app.component.html"
})
export class AppComponent { ... }
我的webpack.config.js
var path = require('path');
module.exports = {
entry: "./App/boot.ts",
output: {
path: path.join(__dirname, './Scripts/dist'),
filename: "bundle.js"
},
resolve: {
extensions: ['.ts', '.js']
},
module: {
loaders: [
{
test: /\.ts$/,
loader: ['awesome-typescript-loader', 'angular2-template-loader']
},
{
test: /\.html$/,
loader: 'raw-loader'
}
]
}
};
package.json
{
"scripts": {
"start": "webpack-dev-server --inline --progress --port 8080",
"build": "rimraf dist && webpack --config config/webpack.prod.js --progress --profile --bail"
},
"dependencies": {
"@angular/common": "~2.2.0",
"@angular/compiler": "~2.2.0",
"@angular/core": "~2.2.0",
"@angular/forms": "~2.2.0",
"@angular/http": "~2.2.0",
"@angular/platform-browser": "~2.2.0",
"@angular/platform-browser-dynamic": "~2.2.0",
"@angularclass/hmr": "~1.2.2",
"@angularclass/hmr-loader": "~3.0.2",
"@angular/router": "~3.2.0",
"@angular/upgrade": "~2.2.0",
"core-js": "^2.4.1",
"rxjs": "5.0.0-beta.12",
"zone.js": "^0.6.26",
"ui-router-ng2": "1.0.0-beta.3"
},
"devDependencies": {
"@types/node": "^6.0.51",
"@types/requirejs": "2.3.1",
"angular2-router-loader": "^0.3.4",
"angular2-template-loader": "^0.6.0",
"css-loader": "0.26.0",
"file-loader": "0.9.0",
"html-loader": "0.4.4",
"html-webpack-plugin": "2.24.1",
"raw-loader": "0.5.1",
"rimraf": "~2.5.4",
"style-loader": "0.13.1",
"typescript": "^2.0.10",
"typings": "2.0.0",
"webpack": "2.1.0-beta.27",
"webpack-dev-server": "2.1.0-beta.12",
"webpack-merge": "0.17.0",
"webpack-notifier": "^1.4.1"
}
}
和tsconfig.json
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false,
"types": [
"node"
]
},
"awesomeTypescriptLoaderOptions": {
"useWebpackText": true
},
"exclude": [
"node_modules",
"dist",
"typings/main",
"typings/index.d.ts"
],
"compileOnSave": true
}
我正在使用 Ui-router,我看到加载了正确的 url,但它只显示模板文件名,如“./appHeader.component.html”,但没有模板。
您需要使用 template: require("./app.component.html")
而不是 templateUrl:"..."
才能使其正常工作。
Webpack 扫描您的文件并搜索例如需要(...)标签。
我找到了我的问题!
不要像
这样使用 ES6 引号templateUrl: \`./app.component.html`
这将在您的应用程序中只呈现“./app.component.html”
使用正常的引号,如下所示:
templateUrl: './app.component.html'
templateUrl: "./app.component.html"
这不起作用的另一个原因是如果您已经编译了与您的 .ts
文件相对应的 .js
文件。一些 IDE 会在您保存或编译时自行创建这些。
这有这样的效果,当请求 'module' 时,它首先找到 .js
文件并且根本不处理 .ts
文件 - 所以它不会去通过这个 'chain'.
编辑您的 .csproj
文件并将其添加为新的 属性 组(首先搜索它尚不存在)。这将防止 Visual Studio 在保存时自动生成 .js
文件。
<PropertyGroup>
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
</PropertyGroup>
确保删除所有生成的 .js
和 .js.map
文件,这些文件在您的 ClientApp
文件夹(组件等)下具有相应的 .ts
文件。首先检查源代码控制/备份以防万一。