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

javascript - vite开发js库,如何build之后只生成一个js文件,并且可以script标签的方式调用?

饶谦
2024-11-19
// package.json
"type": "module",
  "files": [
    "dist",
    "index.d.ts"
  ],
  "main": "./dist/counter.umd.cjs",
  "module": "./dist/counter.js",
  "types": "./index.d.ts",
  "exports": {
    "types": "./index.d.ts",
    "import": "./dist/counter.js",
    "require": "./dist/counter.umd.cjs"
  },

// vite.config.js
export default defineConfig({
  build: {
    lib: {
      entry: './lib/main.js',
      name: 'Counter',
      fileName: 'counter',
    },
  }
})

// lib/main.js
class Counter {
  constructor(options) {
    ...
  }
}
export default Counter

image.png

vite开发js库,run build之后dist生成了两个文件counter.js和counter.umd.cjs,我直接引入<script src="./counter.js" /> 然后console.log(Counter)会报Counter is not defined,但是引用<script src="./dist/counter.umd.cjs" />再console就没有问题是什么原因?
我现在现在的需求是dist只生成一个.js文件,用户既可以通过import引入,也可以通过<script src=”“ /> 方式引入到项目中,该如何实现?

共有2个答案

轩辕翰
2024-11-19

https://cn.vitejs.dev/guide/build.html#library-mode

隆安然
2024-11-19
### 回答

为了只生成一个 `.js` 文件,并且该文件既可以通过 `import` 引入,也可以通过 `<script>` 标签的方式引入,你需要确保构建的输出是一个 UMD (Universal Module Definition) 格式的文件。UMD 格式的文件可以在各种模块加载环境中工作,包括 CommonJS、AMD 以及作为全局变量。

在你的 `vite.config.js` 文件中,你需要做一些调整来确保只生成一个 UMD 格式的文件。你可以通过设置 `fileName` 和 `formats` 来实现这一点。

修改你的 `vite.config.js` 文件如下:

import { defineConfig } from 'vite';

export default defineConfig({
build: {

lib: {
  entry: './lib/main.js',
  name: 'Counter',
  fileName: (format) => `counter.${format}.js`, // 根据格式生成不同的文件名
  formats: ['umd'] // 只生成 UMD 格式的文件
},
rollupOptions: {
  // 确保外部化依赖(如果有的话),这些依赖不会在构建的输出中包括
  external: [],
  output: {
    // 确保生成的 UMD 文件具有全局变量名 'Counter'
    globals: {
      // 这里可以列出需要外部化的依赖及其全局变量名,如果有的话
    }
  }
}

}
});


在这个配置中,`formats: ['umd']` 确保只生成一个 UMD 格式的文件。`fileName: (format) => `counter.${format}.js`` 允许你根据格式自定义文件名,但在这个例子中,由于我们只生成 UMD 格式,所以文件名将是 `counter.umd.js`。不过,为了符合你的需求(只生成一个 `.js` 文件并且可以通过 `<script>` 标签引入),你可以将 `fileName` 设置为 `'counter.js'`,这样不管格式如何,输出文件名都是 `counter.js`。

fileName: 'counter.js', // 只生成一个名为 counter.js 的文件


这样配置后,运行 `vite build` 将只生成一个 `counter.js` 文件,该文件是一个 UMD 格式的库,可以通过 `<script>` 标签引入,并且全局变量名为 `Counter`。

确保在 HTML 中通过 `<script>` 标签引入时,使用正确的路径,例如:

<script src="./dist/counter.js"></script>
<script>
console.log(Counter); // 现在应该能够正确输出 Counter 类
</script>

这样,你的库就可以通过 <script> 标签直接引入,并且全局可用,同时也支持通过 import 引入。

 类似资料:
  • vite如何导入静态.js文件呢?因为我的项目是monorepo架构的,其中有一个common包被其他vue项目所公共引用,然后这个common包里需要动态加载一些.js、.json文件,如何才能在common包放入这些静态文件并直接导入?我试了函数中使用import可以动态导入一些.json文件,但是对于.js文件导入不了。 之前是分别放在引入common的主项目下的public下,然后使用ax

  • 查看一段打包后的js代码,appendChild一个script标签(执行完这些js)之后,又.parentNode.removeChild把这个标签移除了,为什么要这么做,为什么要移除了?

  • 所以我试图用cheerio从我的脚本标签HTML中获取数据 下面是我的scripttag.html: 从playerintance.setup中常量标题->标题 从PlayerInstance.setup中常量srcfiles->源->文件 来自PlayerInstance.setup的常量图像->图像

  • script标签如何引入一个动态生成js代码的链接,并能正常运行? <script>标签引入动态生成的js代码段,执行失败,如何解决? <script>标签引入java等动态生成的js代码段,执行失败,说明如下: 1.a.com ,2.a.com,3.a.com页面都需要引入js的json变量值,所以想用4.a.com写一个动态页面生成如下的js代码内容例如:var jsdata={"list":

  • 本文向大家介绍全面了解js中的script标签,包括了全面了解js中的script标签的使用技巧和注意事项,需要的朋友参考一下 在页面中用script标签引入javascript文件(<script type="text/javascript" src="js文件地址"></script>),浏览器在渲染页面的时候,当读取到script元素时,浏览器不会以HTML或XHTML的方式处理其内容,浏览

  • 本文向大家介绍在js文件中引入(调用)另一个js文件的三种方法,包括了在js文件中引入(调用)另一个js文件的三种方法的使用技巧和注意事项,需要的朋友参考一下 比如我写了一个JS文件,这个文件需要调用另外一个JS文件,该如何实现呢?下面就总结下在js文件中引入另一个js文件的实现 方法一,在调用文件的顶部加入下例代码 注:有时你引用的文件还可能需要引用其他的js,我们需要将需要的那个js文件也以同

  • 问题内容: 我在Web应用程序中使用jquery,我需要将更多jquery脚本文件加载到单个页面中。 Google建议我将所有jquery脚本文件合并到一个文件中。 我怎样才能做到这一点? 问题答案: 在Linux上,您可以使用简单的Shell脚本将多个javascript文件合并为一个。它利用了Closure Compiler在线服务,因此生成的脚本也得到了有效压缩。

  • 本文向大家介绍浅谈js script标签中的预解析,包括了浅谈js script标签中的预解析的使用技巧和注意事项,需要的朋友参考一下 首先介绍预解析,虽然预解析字面意思很好理解,但是却是出坑出的最多的地方,也是bug经常会有的地方,利用好预解析的特性可以解决很多问题,并且提高代码的质量及数量,浏览器在解析代码前会把变量的声明和函数(整个函数体)提前到当前作用域的最顶端。 细节问题:在多对的scr