Я разработал веб-приложение, созданное с использованием ASP.NET Core Web API
и Angular 4
. Мой сборщик модулей Web Pack 2
.
Я хочу, чтобы мое приложение можно было сканировать или делиться ссылками в Facebook, Twitter, Google. url
должно быть таким же, когда какой-то пользователь пытается опубликовать мои новости на Facebook. Например, Джон хочет поделиться страницей с URL-адресом - http://myappl.com/#/hellopage
в Facebook, затем Джон вставляет эту ссылку в Facebook: http://myappl.com/#/hellopage
.
Я видел это руководство по рендерингу на стороне сервера Angular Universal без помощника по тегам и хотел бы сделать рендеринг на стороне сервера. Поскольку я использую ASP.NET Core Web API
, а мое приложение Angular 4
не имеет представлений .cshtml
, поэтому я не могу отправлять данные из контроллера для просмотра через ViewData["SpaHtml"]
с моего контроллера:
ViewData["SpaHtml"] = prerenderResult.Html;
Кроме того, я вижу это руководство Google по Angular Universal, но они используют сервер NodeJS
, а не ASP.NET Core
.
Я хотел бы использовать пререндеринг на стороне сервера. Я добавляю метатеги следующим образом:
import { Meta } from '@angular/platform-browser';
constructor(
private metaService: Meta) {
}
let newText = "Foo data. This is test data!:)";
//metatags to publish this page at social nets
this.metaService.addTags([
// Open Graph data
{ property: 'og:title', content: newText },
{ property: 'og:description', content: newText }, {
{ property: "og:url", content: window.location.href },
{ property: 'og:image', content: "http://www.freeimageslive.co.uk/files
/images004/Italy_Venice_Canal_Grande.jpg" }]);
и когда я проверяю этот элемент в браузере, он выглядит так:
<head>
<meta property="og:title" content="Foo data. This is test data!:)">
<meta property="og:description" content="Foo data. This is test data!:)">
<meta name="og:url" content="http://foourl.com">
<meta property="og:image" content="http://www.freeimageslive.co.uk/files
/images004/Italy_Venice_Canal_Grande.jpg"">
</head>
Я загружаю приложение обычным способом:
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
platformBrowserDynamic().bootstrapModule(AppModule);
и мой конфиг webpack.config.js
выглядит так:
var path = require('path');
var webpack = require('webpack');
var ProvidePlugin = require('webpack/lib/ProvidePlugin');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var CopyWebpackPlugin = require('copy-webpack-plugin');
var CleanWebpackPlugin = require('clean-webpack-plugin');
var WebpackNotifierPlugin = require('webpack-notifier');
var isProd = (process.env.NODE_ENV === 'production');
function getPlugins() {
var plugins = [];
// Always expose NODE_ENV to webpack, you can now use `process.env.NODE_ENV`
// inside your code for any environment checks; UglifyJS will automatically
// drop any unreachable code.
plugins.push(new webpack.DefinePlugin({
'process.env': {
'NODE_ENV': JSON.stringify(process.env.NODE_ENV)
}
}));
plugins.push(new webpack.ProvidePlugin({
jQuery: 'jquery',
$: 'jquery',
jquery: 'jquery'
}));
plugins.push(new CleanWebpackPlugin(
[
'./wwwroot/js',
'./wwwroot/fonts',
'./wwwroot/assets'
]
));
return plugins;
}
module.exports = {
devtool: 'source-map',
entry: {
app: './persons-app/main.ts' //
},
output: {
path: "./wwwroot/",
filename: 'js/[name]-[hash:8].bundle.js',
publicPath: "/"
},
resolve: {
extensions: ['.ts', '.js', '.json', '.css', '.scss', '.html']
},
devServer: {
historyApiFallback: true,
stats: 'minimal',
outputPath: path.join(__dirname, 'wwwroot/')
},
module: {
rules: [{
test: /\.ts$/,
exclude: /node_modules/,
loader: 'tslint-loader',
enforce: 'pre'
},
{
test: /\.ts$/,
loaders: [
'awesome-typescript-loader',
'angular2-template-loader',
'angular-router-loader',
'source-map-loader'
]
},
{
test: /\.js/,
loader: 'babel',
exclude: /(node_modules|bower_components)/
},
{
test: /\.(png|jpg|gif|ico)$/,
exclude: /node_modules/,
loader: "file?name=img/[name].[ext]"
},
{
test: /\.css$/,
exclude: /node_modules/,
use: ['to-string-loader', 'style-loader', 'css-loader'],
},
{
test: /\.scss$/,
exclude: /node_modules/,
loaders: ["style", "css", "sass"]
},
{
test: /\.html$/,
loader: 'raw'
},
{
test: /\.(eot|svg|ttf|woff|woff2|otf)$/,
loader: 'file?name=fonts/[name].[ext]'
}
],
exprContextCritical: false
},
plugins: getPlugins()
};
Можно ли сделать рендеринг на стороне сервера без ViewData
? Есть ли альтернативный способ рендеринга на стороне сервера в ASP.NET Core Web API и Angular 2?
Я загрузил пример в репозиторий github.
ViewData
для отправки html в.cshtml
представление, но я использую только.html
представления, а не.cshtml
представления. - person StepUp   schedule 09.06.2017prerenderResult.Html
из действия? - person Andrii Litvinov   schedule 09.06.2017For example, open Views/Home/Index.cshtml, and add markup like the following:
и этоNow go to your Views/_ViewImports.cshtml file, and add the following line: @addTagHelper "*, Microsoft.AspNetCore.SpaServices"
здесь: github.com/aspnet/JavaScriptServices/tree/dev/src/ - person StepUp   schedule 09.06.2017http://myappl.com/#/hello
вместоhttp://myappl.com/#/hellopage
? - person quetzalcoatl   schedule 16.06.2017