reactjs / React.NET

.NET library for JSX compilation and server-side rendering of React components
https://reactjs.net/
MIT License
2.3k stars 937 forks source link

`AddScriptWithoutTransform` not working correctly on Linux #1292

Open hieucd04 opened 2 years ago

hieucd04 commented 2 years ago

I'm using these library versions:

Runtime environment:

Steps to reproduce


  1. Use this code
    app.UseReact(configuration =>
    {
    configuration
        .AddScriptWithoutTransform("/foo/bar/react.js");            
    });
  2. Deploy to a machine running Linux OS

Actual

ReactScriptLoadException: Could not find a part of the path '\<webroot>/foo/bar/react.js'

Expected

No exception thrown

More info

Workaround

Add \\ at the beginning of the path:

app.UseReact(configuration =>
{
    configuration
        .AddScriptWithoutTransform("\\/foo/bar/react.js");            
});

Root Cause

https://github.com/reactjs/React.NET/blob/3c02e85ee3773254c7447e768798c72613cf9fb0/src/React.AspNet.Middleware/AspNetFileSystem.cs#L51 On Linux, TrimStart('/') is a destructive command

Daniel15 commented 2 years ago
  • Due to some technical limitations, I cannot place Webpack bundle in WebRoot directory

Not even via some build process that copies the file across?

AddScript and AddScriptWithoutTransform were only built to support files in the web root, and both ~ and / at the start (or both together like ~/blah.js) represent a file in the web root. They were never tested with absolute file paths as this is not a common case.

Maybe this could be added as a boolean argument, like AddScriptWithoutTransform("/foo/bar.js", isAbsolutePath: true). We can't change the behaviour of paths starting with a / as it'd break existing call sites.

hieucd04 commented 2 years ago

Not even via some build process that copies the file across?

Sadly, no :( In the project I'm working on, there are other libraries that control the web root. If I place files in the web root the other libraries will do something with them which we don't want.

AddScript and AddScriptWithoutTransform were only built to support files in the web root ...

Oh, I didn't know that! The first time I tested it with absolute path on Windows it worked. So, I thought they supported absolute path.

Maybe this could be added as a boolean argument, like AddScriptWithoutTransform("/foo/bar.js", isAbsolutePath: true) ...

I'm not sure. I think it will work but it feels a bit weird as I've never seen a method designed like that. Usually, the method can determine whether or not the provided path is absolute or not on its own. So, in my opinion, the Developer Experience will not be very good.


I'm gonna leave this issue to you guys. Feel free to close it. Since this behavior cannot be changed, my workaround might live at least until the 6.0 😄