Ich benutze eine Yeoman-Projektvorlage namens "aspnetcore-spa", die eine ASP.net Core 1-Vorlage in Verbindung mit großen SPA-Frameworks ist (Angular2 und Reagieren).Setup-Webpack mit serverseitigem Rendering zum Laden von Sass-Dateien im asp.net-Kernprojekt
Ich habe ein Projekt mit Angular2 erstellt. Der Code der Bio-Platte funktioniert gut und es gibt kein Problem. Sobald ich den Sass-Loader zu webpack.config.js hinzugefügt habe und einen Verweis auf die Sass-Datei aus jeder eckigen Datei gemacht habe.
In webpack.config.js:
var isDevBuild = process.argv.indexOf('--env.prod') < 0;
var path = require('path');
var webpack = require('webpack');
var nodeExternals = require('webpack-node-externals');
var merge = require('webpack-merge');
var allFilenamesExceptJavaScript = /\.(?!js(\?|$))([^.]+(\?|$))/;
// Configuration in common to both client-side and server-side bundles
var sharedConfig = {
resolve: { extensions: [ '', '.js', '.ts' ] },
output: {
filename: '[name].js',
publicPath: '/dist/' // Webpack dev middleware, if enabled, handles requests for this URL prefix
},
module: {
loaders: [
{ test: /\.ts$/, include: /ClientApp/, loader: 'ts', query: { silent: true } },
{ test: /\.scss$/,include:/ClientApp/, loaders: ["style", "css", "sass"] },
{ test: /\.html$/,include: /ClientApp/, loader: 'raw' },
{ test: /\.css$/, loader: 'to-string!css' },
{ test: /\.(png|jpg|jpeg|gif|svg)$/, loader: 'url', query: { limit: 25000 } }
]
}
};
// Configuration for client-side bundle suitable for running in browsers
var clientBundleOutputDir = './wwwroot/dist';
var clientBundleConfig = merge(sharedConfig, {
entry: { 'main-client': './ClientApp/boot-client.ts' },
output: { path: path.join(__dirname, clientBundleOutputDir) },
plugins: [
new webpack.DllReferencePlugin({
context: __dirname,
manifest: require('./wwwroot/dist/vendor-manifest.json')
})
].concat(isDevBuild ? [
// Plugins that apply in development builds only
new webpack.SourceMapDevToolPlugin({
filename: '[file].map', // Remove this line if you prefer inline source maps
moduleFilenameTemplate: path.relative(clientBundleOutputDir, '[resourcePath]') // Point sourcemap entries to the original file locations on disk
})
] : [
// Plugins that apply in production builds only
new webpack.optimize.OccurenceOrderPlugin(),
new webpack.optimize.UglifyJsPlugin()
])
});
// Configuration for server-side (prerendering) bundle suitable for running in Node
var serverBundleConfig = merge(sharedConfig, {
entry: { 'main-server': './ClientApp/boot-server.ts' },
output: {
libraryTarget: 'commonjs',
path: path.join(__dirname, './ClientApp/dist')
},
target: 'node',
devtool: 'inline-source-map',
externals: [nodeExternals({ whitelist: [allFilenamesExceptJavaScript] })] // Don't bundle .js files from node_modules
});
module.exports = [clientBundleConfig, serverBundleConfig];
In meiner Komponente:
npm install node-sass sass-loader --save-dev
Ich habe überprüft:
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-wine',
template: require('./wine.component.html'),
styles: require('./wine.component.scss')
})
export class WineComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}
ich bereits npm Pakete relevant für Sass Loader installiert haben die Datei main-server.js im Ordner wwwroot/dist, die das Ergebnis der Webpack-Bündelung ist, sah ich, dass die .scss-Datei ich s geladen und die Stile werden korrekt verarbeitet. Sobald ich die App though, zeigt diese Ausnahme, die von der serverseitigen Rendering-Seite kommt:
Eine nicht behandelte Ausnahme trat während der Verarbeitung der Anfrage auf.
Ausnahme: Aufruf des Node-Moduls mit Fehler fehlgeschlagen: ReferenceError: Fenster ist nicht definiert unter E: \ Dev \ MyApp \ MyAppCore \ src \ MyApp.Web \ ClientApp \ dist \ main-server.js: 573: 31 um E: \ Dev \ MyApp \ MyAppCore \ src \ MyApp.Web \ ClientApp \ dist \ main-server.js: 568: 48 in module.exports (E: \ Dev \ MyApp \ MyAppCore \ src \ MyApp.Web \ ClientApp \ dist \ main-server.js: 590: 69) bei Object. (E: \ Dev \ MyApp \ MyAppCore \ src \ MyApp.Web \ ClientApp \ dist \ main-server.js: 526: 38) unter webpack_require (E: \ Dev \ MyApp \ MyAppCore \ src \ MyApp.Web \ ClientApp \ dist \ main-server.js: 20: 30) unter E: \ Dev \ MyApp \ MyAppCore \ src \ MyApp.Web \ ClientApp \ dist \ main-server.js: 501: 22 bei Object.module.exports (E: \ Dev \ MeineApp \ MyAppCore \ src \ MeineApp.Web \ ClientApp \ dist \ Hauptserver.js: 506: 3) um webpack_require (E: \ Dev \ MyApp \ MyAppCore \ src \ MyApp.Web \ ClientApp \ dist \ main-server.js: 20: 30) bei Objekt. (E: \ Dev \ MyApp \ MyAppCore \ src \ MyApp.Web \ ClientApp \ dist \ main-server.js: 129: 25) unter webpack_require (E: \ Dev \ MyApp \ MyAppCore \ src \ MyApp.Web \ ClientApp \ dist \ main-server.js: 20: 30)
Es ist offensichtlich wegen des serverseitigen Renderings des Webpacks, da es den Code auf der Seite Node.js (über ASP.net Core's Javascript Services) und dort ausführt ist ein Code, der mit dem Objekt DOM window
gekoppelt ist, das auf Knoten nicht gültig ist.
Irgendwelche Hinweise?