reactjs - Hvordan man tilføjer react med typescript til en eksisterende asp.net core mvc-applikation
Jeg prøver at tilføje React-komponenter (TypeScript) i form af .tsx-filer, som skal gengives på nogle af mine ASP.NET Core MVC .cshtml-sider, men jeg kan ikke få det til at fungere korrekt. Er der en god måde at gøre dette på?
Svar #1
Du skal grundlæggende bruge webpack og ændre din .csproj for at køre et yarn build før kørsel for at transpile din Typescript og forbinde alle afhængighederne i en bundle.
Start med at tilføje Nuget-pakker: Yarn.MSBuild og Microsoft.TypeScript.MSBuild til dit projekt.
tsconfig.json: (sæt i rodmappen af dit projekt)
{
"typeAcquisition": {
"enable": true
},
"compileOnSave": false,
"compilerOptions": {
"sourceMap": true,
"module": "commonjs",
"target": "es6",
"noImplicitAny": false,
"jsx": "react",
"outDir": "wwwroot/dist",
"moduleResolution": "node"
},
"exclude": [
"node_modules",
"wwwroot"
]
}
^^Bemærk, at dette vil få dine .tsx-filer til at transpile til mappen: wwwroot/dist, skift outDir, hvis du vil have det et andet sted
package.json (placeres i projektets rodmappe)
{
"scripts": {
"webpack": "webpack"
},
"devDependencies": {
"@types/react": "^16.4.6",
"@types/react-dom": "^16.0.6",
"@types/webpack-env": "^1.13.6",
"aspnet-webpack": "^3.0.0",
"awesome-typescript-loader": "^5.2.0",
"babel-core": "^6.26.3",
"bootstrap": "4.3.1",
"clean-webpack-plugin": "^0.1.19",
"typescript": "^2.9.2",
"webpack": "^4.15.1",
"webpack-cli": "^3.0.8",
"webpack-dev-middleware": "^3.1.3",
"webpack-hot-middleware": "^2.22.2"
},
"dependencies": {
"react": "^16.4.1",
"react-dom": "^16.4.1",
"react-hot-loader": "^4.0.0"
}
}
^^tilføj alle npm-afhængigheder, du har brug for, i din package.json (selvfølgelig) samt dine Typescript @type-afhængigheder. Dette er bare de minimale nødvendige pakker for React og hot reloading.
Webpack.targets (placeres i projektets rodmappe)
<Project>
<Target Name="EnsureNodeModulesInstalled"
BeforeTargets="Build"
Inputs="yarn.lock;package.json"
Outputs="node_modules/.yarn-integrity">
<Yarn Command="install" />
</Target>
<Target Name="PublishWebpack"
BeforeTargets="Publish">
<ConvertToAbsolutePath Paths="$(PublishDir)">
<Output TaskParameter="AbsolutePaths" PropertyName="AbsPublishDir" />
</ConvertToAbsolutePath>
<Yarn Command="run webpack --env.prod --env.publishDir=$(AbsPublishDir)" />
</Target>
</Project>
^^denne fil Webpack.target skal tilføjes til din .csproj-fil (jeg tilføjede den til slutningen) og skal tilføjes sådan her: I din .csproj:
<Import Project="Webpack.targets" />
webpack.config.js: (sæt i rodmappen af dit projekt)
const path = require('path');
const CheckerPlugin = require('awesome-typescript-loader').CheckerPlugin;
const CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = (env) => {
const isDevBuild = !(env && env.prod);
const outputDir = (env && env.publishDir)
? env.publishDir
: __dirname;
return [{
mode: isDevBuild ? 'development' : 'production',
devtool: 'inline-source-map',
stats: { modules: false },
entry: {
'App': './ClientApp/App.tsx',
},
watchOptions: {
ignored: /node_modules/
},
output: {
filename: "dist/[name].js",
path: path.join(outputDir, 'wwwroot'),
publicPath: '/'
},
resolve: {
// Add '.ts' and '.tsx' as resolvable extensions.
extensions: [".ts", ".tsx", ".js", ".json"]
},
devServer: {
hot: true
},
module: {
rules: [
// All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'.
{
test: /\.tsx?$/,
include: /ClientApp/,
loader: [
{
loader: 'awesome-typescript-loader',
options: {
useCache: true,
useBabel: true,
babelOptions: {
babelrc: false,
plugins: ['react-hot-loader/babel'],
}
}
}
]
}
]
},
plugins: [
new CleanWebpackPlugin(path.join(outputDir, 'wwwroot', 'dist')),
new CheckerPlugin()
]
}];
};
^^Bemærk entry point og modules->rules->include. Det betyder, at webpack bliver konfigureret til at kigge i en mappe kaldet ClientApp (i rodmappen af dit projekt) efter .tsx-filerne, der skal transpileres. Hvis du vil have dine .tsx-filer et andet sted, skal du blot ændre disse. Entry point angiver også, at filens entry point er App.tsx, sæt din højeste niveau React-komponent (som afhænger af alle dine andre komponenter) heri, eller inkluder den simpelthen i denne fil.
Tilføj nu WebpackDevMiddleware til din Startup->Configure-funktion:
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
{
HotModuleReplacement = true
});
Nu, hvis du i din App.tsx-fil vælger en div (sig en med id: 'root') og renderer din komponent i den, er alt, hvad du behøver at gøre for at tilføje din React-komponent til din .cshtml-fil, at inkludere den transpilerede App.js (i wwwroot/dist) i .cshtml sammen med en div med id: 'root', og bam. Du har React-komponenter, der kan tilføjes til .cshtml uden at bruge nogen SPA-bs 🚀
Kredit: https://natemcmaster.com/blog/2018/07/05/aspnetcore-hmr/
