React.js与带有create-react-app的ASP MVC集成

时间:2019-03-03 17:05:17

标签: javascript c# .net asp.net-mvc reactjs

我是React世界的新手,我正在尝试将其集成到一个使用ASP MVC .net的新项目中。 我想对create react app,不感兴趣的React.net integration使用React.js。

我看到几个examples不使用CRA命令,而是他们自己配置构建设置(webpack,babel等),我正在尝试这种方法,但是我担心如果项目增长,我将无法跟踪更新等。

在该example中,您需要将webpack捆绑文件的输出添加到index.cshtml中。

<div id="root"></div>

@section scripts {
    <script src="~/Scripts/React/dist/bundle.js"></script>
}

但是,当我使用CRA命令时,只有在为生产而构建时,我才可以在开发过程中访问该文件。

我在这里迷失了一点,用CRA达到我所需要的最好的方法是什么?

我非常感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

我认为无法使用CRA来完成您想做的事情(我也想做),并且我相信弹出后您最终会变得非常复杂,难以管理。

我的出发点:一个大型ASP MVC应用程序在单个MVC控制器/视图(默认索引页)中运行Angular.js前端。 我的目标是:停止开发Angular.js应用,并尽可能使用React开发新功能,即当它独立于现有UI时;我们称之为新模块。我仍然需要将所有内容都保留在同一个MVC应用程序中,因为它可以提供身份验证和授权。

解决方案:自定义(相对于CRA)webpack构建工具链,其起点是您提供的youtube example。多亏了this other tutorial,我才能够添加热重装功能,经过几个小时的反复试验,我为CSS,图像和字体添加了加载器。捆绑的结果肯定比CRA的结果最佳,但它与旧的Angular.js共存,因此我认为它足够好。

这是一些代码。

webpack.config.js

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const WebpackNotifierPlugin = require('webpack-notifier');
const BrowserSyncPlugin = require('browser-sync-webpack-plugin');
const webpack = require('webpack');

const PUBLIC_PATH = 'Scripts/react/dist';

module.exports = (env, arg) => {

    const isDevelopment = arg.mode === 'development';

    const fileLoaderName = file => {
        if (isDevelopment)
            return '[folder]/[name].[ext]';
        return '[folder]/[name].[ext]?[contenthash]';

    };

    return {
        entry: './app.js',
        watch: isDevelopment,
        devtool: isDevelopment ? 'source-map' : undefined,
        module: {
            rules: [
                {
                    test: /\.(js|jsx)$/,
                    exclude: /node_modules/,
                    use: [
                        'babel-loader',
                        {
                            loader: 'eslint-loader',
                            options: {
                                fix: true
                            }
                        }
                    ],
                },
                {
                    test: /\.css$/,
                    use: [
                        MiniCssExtractPlugin.loader,
                        'css-loader'
                    ]
                },
                {
                    test: /\.(png|jpe?g|gif|svg)$/i,
                    use: [
                        {
                            loader: 'file-loader',
                            options: {
                                name: fileLoaderName,
                                publicPath: PUBLIC_PATH,
                                postTransformPublicPath: p => `__webpack_public_path__ + ${p}`
                            }
                        }
                    ]
                },
                {
                    test: /\.(woff|woff2|ttf|otf|eot)$/i,
                    use: [
                        {
                            loader: 'file-loader',
                            options: {
                                name: fileLoaderName,
                                publicPath: PUBLIC_PATH,
                                postTransformPublicPath: p => `__webpack_public_path__ + ${p}`
                            }
                        }
                    ]
                }
            ],
        },
        plugins: [
            new webpack.ProgressPlugin(),
            new WebpackNotifierPlugin(),
            new BrowserSyncPlugin(),
            new CleanWebpackPlugin(),
            new MiniCssExtractPlugin({ filename: "bundle.css" })
        ],
        resolve: {
            extensions: ['*', '.js', '.jsx']
        },
        output: {
            path: __dirname + '/dist',
            publicPath: '/',
            filename: 'bundle.js'
        },
    }

};

.babelrc

{
  "presets": [
    "@babel/preset-env",
    "@babel/preset-react"
  ],
  "plugins": [
    "@babel/plugin-transform-runtime"
  ]
}

.eslintrc

{
  "extends": [
    "plugin:react-app/recommended",
    "prettier"
  ],
  "plugins": [
    "prettier"
  ],
  "rules": {
    "prettier/prettier":  ["error"],
    "quotes": [
      "error",
      "single",
      { "allowTemplateLiterals": true }
    ]
  }
}

.prettierrc

{
  "singleQuote": true
}

package.json

  ...
  "scripts": {
    "start": "webpack --mode development",
    "build": "webpack --mode production",
    ...
  },

仍然缺少一些有用的东西,我计划在将来添加,例如css模块和其他css优化,但是我认为这并不困难。

相关问题