blazor组件使用并置加载js文件


前言

因为正常加载的js文件是组件互通的,导致每一个组件都能通用里面的js方法。通过并置加载js文件,不仅方便简洁,还可以进行js隔离。

实现

需要先将js名称设置为对应组件的名称,这样会自动将文件并置到对应组件下面。

接下来,就是加载js文件了。我们需要将IJSRuntime模块以IJSObjectReference导入,并赋值到变量module中,通过变量module来调用js函数。(需要在组件中注入 @inject IJSRuntime _js ,写在组件顶部就行)InvokeAsync第二参数路径是对应的wwwroot中的文件,下面会说明。

//Index.razor.cs
public partial class Index
    {
        private IJSObjectReference module;

        #region 生命周期方法
            
        /// 
        /// 生命周期事件-渲染后
        /// 
        /// 
        /// 
        protected override async Task OnAfterRenderAsync(bool firstRender)
        {
            if (firstRender)
            {
                module = await _js.InvokeAsync("import",
        "./js/Index.razor.js");

                await module.InvokeVoidAsync("Initialize");
            }
        }
      
        #endregion
    }

当然,到这里还没完事,如果你去运行,会发现找不到对应的js模块或方法。这是因为我们一般只开放了静态资源文件夹的访问权限(这里我不建议去开放其他路径的访问权限,这样是不安全的),我们需要通过在libman.json内添加上面的配置,将对应的js文件在wwwroot(静态资源)文件夹中自动生成。微软文档LibMan使用

//libman.json
{
  "version": "1.0",
  "defaultProvider": "cdnjs",
  "libraries": [
    {
      "provider": "filesystem",
      "library": "Pages/",
      "destination": "wwwroot/js/",
      "files": [
        "Index.razor.js"
      ]
    }
  ]
}

当你运行后,你会发现在wwwroot文件夹中libman配置的路径下自动生成了对应的js文件。但是,你修改了原js文件后,映射的js文件并不会自动同步,需要手动鼠标右键libman.json=》“清理客户端库”,进行重新生成。

最后,js文件方法记得添加export 关键字。

//Index.razor.js
export function Initialize() {
	console.log("不想上班!!!")
}

之前遇到这个问题,便发了个博问,研究解决了一下。想着还是写给文章吧!博问的方式不好找。

blazor组件并置的js文件问题_已解决_博问_博客园 (cnblogs.com)