当前位置: 首页 > 知识库问答 >
问题:

javascript - Vite打包UMD文件后,如何在HTML中直接调用暴露的方法?

袁奇逸
2024-05-23

有一个打包好的文件umd.js文件,我希望能在html中直接使用他暴露出来的方法,出了将方法挂载到window上还有其他办法吗,这个是我暴露方式,打包是它通过vite打包的

const canvasEditorFun = {  initEditorByFile,  getHTML,  saveCEData,  initEditorByData}export default canvasEditorFun

vite.config.ts

plugins: [        cssInjectedByJsPlugin({          styleId: `${name}-style`,          topExecutionPriority: true        }),        {          ...typescript({            tsconfig: './tsconfig.json',            include: ['./src/**']          }),          apply: 'build',          declaration: true,          declarationDir: 'types/',          rootDir: '/'        }      ],      build: {        lib: {          name,          fileName: name,          // entry: path.resolve(__dirname, 'src/editor/index.ts')          entry: path.resolve(__dirname, 'src/main.ts')        },        rollupOptions: {          output: {            sourcemap: true          }        }      }

我希望可以直接在html中引用暴露出来的方法

共有1个答案

吕成业
2024-05-23

要在HTML中直接使用Vite打包的UMD模块中暴露的方法,确实最直接的方式是将这些方法挂载到window对象上。但如果你不想这样做,还有其他几种方法可以实现你的目标。

1. 使用模块加载器

你可以使用像RequireJSSystemJS这样的模块加载器来在浏览器中动态加载UMD模块,并调用其暴露的方法。这要求你的HTML页面包含模块加载器的脚本,并使用加载器的API来加载和执行你的UMD模块。

2. 使用<script type="module">

如果你的环境支持ES模块(即现代浏览器),你可以使用<script type="module">标签来加载和执行ES模块。然而,Vite默认打包成UMD格式,这可能不是纯粹的ES模块。你需要确保你的Vite配置可以输出ES模块格式的构建产物,然后你可以这样做:

<script type="module">  import { initEditorByFile, getHTML, saveCEData, initEditorByData } from './path/to/umd.js';  // 然后你可以调用这些方法  initEditorByFile();  // ...其他方法调用</script>

请注意,即使你的Vite配置输出UMD文件,你可能需要确保UMD模块暴露一个可以从ES模块导入的接口。这可能需要修改你的模块暴露方式,或者在你的Vite配置中指定一个不同的输出格式。

3. 使用<script>标签并查询全局对象

如果UMD模块确实将某些内容暴露到全局作用域(比如window),你可以通过<script>标签加载UMD文件,然后查询全局对象来获取你想要的方法。但这种方式并不是直接调用暴露的方法,而是间接通过全局对象来访问。

<script src="path/to/umd.js"></script><script>  // 假设UMD模块将canvasEditorFun对象暴露到了window上  if (window.canvasEditorFun) {    window.canvasEditorFun.initEditorByFile();    // ...其他方法调用  }</script>

总结

如果你希望直接在HTML中引用UMD模块暴露的方法而不挂载到window上,那么使用模块加载器或<script type="module">可能是更好的选择。然而,这通常意味着你需要对模块构建和加载有更多的控制,并可能需要修改你的模块暴露方式或Vite配置。如果你只是想要简单地在HTML中使用这些方法,并且不介意将它们添加到全局作用域,那么使用<script>标签并通过全局对象访问这些方法是最简单的方法。

 类似资料:
  • 这是我的代码,这不是一个特定的程序。我只是用java数组列表和制作txt文件来练习,并在这个文件中存储数组列表变量。我尝试创建一个类,在这个类中,我为扫描仪创建了一个输入方法,然后将它存储到数组列表中。第二种方法是制作txt文件。第三种方法是在这个txt文件中添加thing。所有方法都可以,但我不知道如何将Arraylist数据导入到txt文件中。我是一个乞丐,我的问题对某些人来说可能是愚蠢的,我

  • vite dev可以跑的没问题,打包到生产环境出现这个xr is not function是三方包里的,这到底是什么问题??? 解决了 是 requireTransform({ 但我不知道为什么要排除node_modules 下的文件,有人能解释一下吗

  • 后台返回一个html文件的链接,想要在前端预览查看,使用window.open("链接")打开,但是浏览器直接下载了,并没有打开文件 后台增加Content-Disposition:inline还是打开

  • vite打包如何不生成vite.svg,index应用的favicon已经改为别的图标,打包还是带vite.svg,如何配置可不生成vite.svg?

  • 现在遇到个这么个需求,就是项目用的vite的打包工具 我现在想实现把项目用vite打包, 然后把项目中的其中一两个组件也单独打包成一个js,类似于把其中一两个组件打包成组件库的js 也就是执行npm run build的时候既打包了项目,又打包了其中部分组件为组件库的js,供外部html直接引入这个打包好的js进行使用,这个有办法实现吗

  • 问题内容: 我最近用Slick2D开发了一个游戏,我直接访问了所有图像,例如 与使用将加载资源的类或使用输入流相反。 我想知道是否仍然可以将所有资源加载到jar中,我将该文件夹添加到了我的buildpath中,并使用jarsplice添加了我的库和本机,但是jar无法运行,因为它找不到图像。 问题答案: 正在研究运行应用程序的根文件系统。如果要使用jarfile中打包的资源,则必须执行以下操作: