reactjs/React.NET

`AddScriptWithoutTransform` not working correctly on Linux

hieucd04 opened this issue · 2 comments

I'm using these library versions:

  • ReactJS.NET: 5.2.12
  • JavaScriptEngineSwitcher: 3.17.4

Runtime environment:

  • OS: Linux (Ubuntu 20.04)
  • .NET Version: 6

Steps to reproduce


  1. Use this code
app.UseReact(configuration =>
{
    configuration
        .AddScriptWithoutTransform("/foo/bar/react.js");            
});
  1. 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

  • Works fine on Windows, only reproducible on Linux
  • Due to some technical limitations, I cannot place Webpack bundle in WebRoot directory

Workaround

Add \\ at the beginning of the path:

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

Root Cause

relativePath = relativePath.TrimStart('~').TrimStart('/').TrimStart('\\');

On Linux, TrimStart('/') is a destructive command

  • 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.

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 😄