【问题标题】:React Js with Visual studio 2017 with TypescriptReact Js 与 Visual Studio 2017 与 Typescript
【发布时间】:2020-01-16 09:48:28
【问题描述】:

我是 ReactJs 的新手,所以我尝试使用 typescript 在 Visual Studio 中创建新项目。默认情况下,Visual Studio 为我提供了带有 javascript 的模板,所以我在 Visual Studio 中创建了新的空项目。

比我使用 Nuget 安装下面的包

npx create-react-app my-app --template typescript
Install-Package Microsoft.AspNetCore.SpaServices.Extensions -Version 2.1.1

然后在我构建了我的项目但在项目中出现了很多错误之后。所以我用 JS 模板创建了项目,并在 .csproj 文件中的 Line 下面进行了反应和复制,它工作正常。但我不明白为什么我们需要这样做将此行手动放入 .csproj 文件中。

<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>

所以我的问题是为什么我们需要将这一行手动放入项目中,如果有任何更好的方法来使用 .net 核心实现 react js,请告诉我,以便我可以在 Visual Studio 中使用它。

【问题讨论】:

  • 您可以尝试关注:github.com/Microsoft/… 以获取模板创建的项目。 (在 VS 中,创建一个 ASP Net Core 2.2 类型的项目并选择 React/Redux)。但就我所知,我还没有让它工作。

标签: reactjs typescript visual-studio


【解决方案1】:

我个人建议学习和使用 Webpack 和 NPM 来管理所有前端的东西,而不是乱用模板或 Nuget 包。无论如何,这些都是值得了解的技术。我知道一开始这很令人困惑,开始工作涉及大量的跑腿工作,并且没有唯一正确的方法,但最终最好自己掌握构建过程。

这是我将要描述的步骤的回购:https://github.com/tedchirvasiu/net-core-react-ts-starter

第 1 步:https://nodejs.org/en/download/ 安装 Node 和 NPM(如果您还没有的话)

第 2 步: 创建一个新的 empty .Net Core Web 应用程序。我们将尽可能地做到这一点。

第 3 步: 打开命令窗口并将工作目录更改为您的 项目 文件夹。或者,在 VS 中,您可以右键单击您的项目,然后单击“在文件资源管理器中打开文件夹”。然后在 Windows 资源管理器的地址栏中键入“cmd”。这应该会打开一个已设置工作目录的 cmd 窗口。 现在在命令窗口中输入以下 2 个命令:

npm init -y
npm install --save-dev webpack webpack-cli clean-webpack-plugin html-webpack-plugin typescript ts-loader react react-dom @types/react @types/react-dom

第一行将初始化你的 package.json 文件。第二行将安装 webpack、react、typescript、react 的类型和我们将用于构建过程的几个 webpack 插件。

第 4 步: 由于这将是一个单页应用程序,因此我们需要一个主控制器和视图来呈现初始页面。因此,转到您的项目,右键单击,添加 -> 新建文件夹并创建一个名为“Controllers”的文件夹。右键单击新创建的文件夹,转到 Add -> Controller... 并创建一个名为 DefaultController 的新空 MVC 控制器。这应该有一个返回 View() 的 Index 方法。

第 5 步: 创建一个名为“Views”的文件夹,并在其中创建一个名为“Default”的文件夹以匹配您的 DefaultController。到目前为止的基本 MVC 内容。这里有一些不同的东西:您将创建一个名为“Index_template.cshtml”的文件,其内容如下

<!DOCTYPE html>
<html>
<head>
    <% for (var css in htmlWebpackPlugin.files.css) { %>
    <link href="<%= '@Url.Content("~' + htmlWebpackPlugin.files.css[css] + '")' %>" rel="stylesheet">
    <% } %>
</head>
<body>

    <div id="app"></div>

    <script>
        window.baseUrl = "@Url.Content("~/")";
        window.resourcesBaseUrl = "@Url.Content("~/dist/")";
    </script>

    <% for (var chunk in htmlWebpackPlugin.files.chunks) { %>
    <script src="<%= '@Url.Content("~' + htmlWebpackPlugin.files.chunks[chunk].entry + '")' %>"></script>
    <% } %>
</body>
</html>

为什么是_template?每次您更改前端代码中的某些内容时,Webpack 都会重新构建您的应用程序并创建一个新的包(一个包含您所有代码的新的大 javascript 文件),并且这个包每次都会有不同的名称(因为它包含一个哈希所以你不会'缓存没有问题)。我们不想在每次生成新包时手动更新视图中的脚本引用,因此我们将使用 Webpack 生成实际的 Index.cshtml 文件。您可以看到它甚至不是有效的 cshtml(如果它引起问题,您可以将扩展名更改为其他内容),因为它具有那些类似于旧 ASPX 时代的

第 6 步:更新您的 Startup.cs 以使用 MVC,提供静态文件(以获取我们的 javascript 代码)并将所有未使用的路径路由到我们的 DefaultController。

    public void ConfigureServices(IServiceCollection services) {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
        if (env.IsDevelopment()) {
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles();

        app.UseMvc(routes => {
            routes.MapRoute("default", "{controller=Default}/{action=Index}");
            routes.MapRoute("catch-all", "{*url}", new { controller = "Default", action = "Index" });
        });
    }

第 7 步:在您的项目中,创建一个名为“tsconfig.json”的新文件,其内容如下:

{
  "compilerOptions": {
    "baseUrl": "./",
    "target": "es5",
    "lib": [
      "es2017",
      "dom"
    ],
    "sourceMap": true,
    "allowJs": true,
    "noImplicitAny": false,
    "moduleResolution": "node",
    "jsx": "react"
  }
}

确保 Build Action 设置为“None”,否则 VS 可能会对此感到厌烦并开始为您编译 ts 文件。

第 8 步: 现在我们需要配置 webpack。使用以下代码在项目根目录中创建另一个名为“webpack.config.js”的文件:

const path = require('path');
const devMode = process.env.NODE_ENV !== 'production';
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
    entry: {
        app: './src/main.tsx'
    },
    resolve: {
        extensions: ['.ts', '.tsx', '.js', '.json']
    },
    devtool: 'source-map',
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                loader: "ts-loader",
                include: path.resolve(__dirname, "src"),
            }
        ]
    },
    plugins: [
        new CleanWebpackPlugin(), //This empties the dist folder
        new HtmlWebpackPlugin({
            chunks: ['app'],
            inject: false, //We generate the tags manually with lodash templating
            template: path.resolve(__dirname, 'Views/Default/Index_template.cshtml'), //This is our template
            filename: path.resolve(__dirname, 'Views/Default/Index.cshtml') //This is our actual Index.cshtml file
        })
    ],
    output: {
        filename: devMode ? '[name].bundle.[hash].js' : '[name].bundle.[chunkhash].js',
        path: path.resolve(__dirname, 'wwwroot/dist'), //This is where our bundles are going to go
        publicPath: '/dist/'
    }
};

第 9 步:我们几乎完成了设置。我们现在要做的就是为我们将用于构建的命令创建一些快捷方式。转到 package.json 文件并在“脚本”对象内,使用以下内容:

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build-dev": "set NODE_ENV=development&& webpack -d",
    "watch": "set NODE_ENV=development&& webpack --watch -d",
    "build": "set NODE_ENV=production&& webpack -p"
}

第 10 步:好的,设置到此为止。剩下要做的就是在您的项目中创建一个名为“src”的新文件夹。在这里,您将拥有前端内容的所有源代码。在 src 中创建一个 main.tsx 文件。这将是您的切入点。在其中粘贴以下 hello-world 代码:

import * as React from 'react'
import * as ReactDOM from 'react-dom'

ReactDOM.render(<div>Hello world!</div>, document.getElementById('app'));

第 11 步: 最后让我们构建并运行我们的应用程序。在您在步骤 3 中打开的命令窗口中,键入

npm run watch

这将运行我们在 package.json 文件中第 9 步指定的命令。现在 webpack 将构建我们的应用程序并监视任何更改。当它看到 src 中的代码被修改时,它会自动重建。当您准备好发布时,请改用“npm run build”来创建优化的包。

现在只需点击播放并运行您的服务器 (F5)。你应该会看到你的 hello world react 应用程序 :) 不要忘记查看 repo 以供参考。

【讨论】:

    猜你喜欢
    • 2017-12-14
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2017-05-28
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多