
今儿拿到个需求,写个 js 库,供第三方使用。
习惯 vue 了,突然就把我整不会了。。
大致是这样,写个 js 库,里面封装好一个小界面和交互。比如一个华丽的 mp3 播放器。 用户直接引入 js ,然后实例化配置,就会在指定的 dom 中插入这个播放器,并使用。
但是已经习惯了 vue 了,是否能用 vue 写这么个东西。最后脱离 vue 成为一个单文件库。
脑子空白一片,没思路。
24小时汇报。
跟着svelte的官方教程看了一点点,然后vite的官方教程看了一点点。
首先基于vite把svelte项目搭起来: yarn create vite
然后修改vite配置文件改为库模式,参考: https://cn.vitejs.dev/guide/build.html#library-mode
创建库模式中的entry文件:
import App from './App.svelte' export default App 打包: yarn build
使用:随便一个普通的html文件,script:src 方式引入打包后生成的umd文件;写一个挂载点的DOM<div id="app"></div>; 最后实例化new myLib({target: document.getElementById('app')})
当然除了target还有其它参数,比如使用{props: {a: 1, b: 2}}传参,详见 https://svelte.dev/docs#run-time-client-side-component-api
1 cydysm 2022-03-09 14:56:32 +08:00 可以啊 注意要支持 script 引入的话就输出 umd 格式 把 vue 和其他一些依赖配置为 external 你可以参考 element 的做法 |
2 Natsuno 2022-03-09 14:56:57 +08:00 上传到 npm 库来引入,不就和你写 vue 正常 import 一样 |
3 cydysm 2022-03-09 14:57:44 +08:00 另外 你说的脱离 vue 是 runtime 不需要 vue 吗 那应该不行 |
4 murmur 2022-03-09 14:58:41 +08:00 第三方是什么样的第三方,能拿到源码么,如果是开源的为什么要脱离 vue ,如果是加密的还是建议单 js 引入 |
5 renmu123 2022-03-09 14:58:51 +08:00 via Android jQuery 一把梭吧 23333 |
7 snoopyhai OP @cydysm 对,runtime 脱离 vue 。比如目前已经有网站的客户,是 jquery 的。script:src 引入后拿到一个全局变量,然后去实例化配置,之类的。。 |
8 snoopyhai OP @murmur 第三方不可控,可以理解为我写了个 js 播放器,各种网站都有可能去使用,有源生的有 jquery 有 vue 有 react 的等等。 |
9 cydysm 2022-03-09 15:03:56 +08:00 |
10 lower 2022-03-09 15:04:57 +08:00 直接以 iframe 方式引入吧 |
11 snoopyhai OP 补充一下: 第三方是不可控的,就好比早些年间,各大站长喜欢引入站长统计的 js 库一样。 啥技术栈都有,但只要 script:src 引入,并简单配置,就能用起来。 只不过习惯 vue 了,想在界面部分,用 vue 的这种数据绑定模式,写起来顺手。 |
12 snoopyhai OP 或者我该看看 svelte ?? |
13 shakukansp 2022-03-09 15:12:41 +08:00 vue 写完,webpack 编译好打包,给一个 Index.js 的入口,好似没有什么问题 |
14 shakukansp 2022-03-09 15:13:15 +08:00 @shakukansp webpack 打包的时候可以选择输出为一个挂载在 window 上的对象的 |
15 GoogleUser 2022-03-09 15:19:23 +08:00 Webpack ,Rollup ,Vite 都支持打包成你想要的,要在浏览器里用的话,选择 UMD 模式 建议试试 Vite 的库模式 cn.vitejs.dev/guide/build.html#library-mode |
16 musi 2022-03-09 15:22:23 +08:00 考虑一下 Web Components ? https://developer.mozilla.org/zh-CN/docs/Web/Web_Components |
18 c1273082756 2022-03-09 15:30:49 +08:00 iframe? |
19 KouShuiYu 2022-03-09 15:38:07 +08:00 可以把 Vue 打包进去就行了 |
20 JaxXu 2022-03-09 19:50:34 +08:00 petite-vue 可以考虑一下 , 如果体积受限的话 svelte 如果只是简单的业务可以考虑一下 |
21 narmgalaxy 2022-03-09 20:04:28 +08:00 |
22 MrTLJH 2022-03-09 21:34:22 +08:00 via Android 纯 js 呗,不会原生 js 了么,何必用 vue |
23 Envov 2022-03-09 23:19:17 +08:00 via iPhone vuecli 支持发布指定入口文件,还支持命名空间,你只要在入口文件导出一个函数,函数接受 dom 对象,new vue 的 el 接受该 dom 或者直接 mount()后得到$el 就是响应式的视图,将$el 挂在 dom 的子里面 这个过程中 vue 也参与了构建,那边可以直接 script 引入 |
24 Buges 2022-03-10 01:38:37 +08:00 via Android 换 svelt 最合适。vue/react 都得内嵌一个完整的运行时。 |
25 ccyu220 2022-03-10 08:39:36 +08:00 参考那些嵌入的天气插件。如果是 PC 网页,其实一个 Vue 的运行时并没有多大。 |
26 chnwillliu 2022-03-10 10:31:15 +08:00 via Android 运行时让使用者引入,那你的库就是个 Vue 组件库,参考其他 Vue 组件库写法就行。 运行时包括在库里,那就把你写的组件库套一层 Vue App 初始化的代码,向外暴露一个普通函数就行。 |
27 lin07hui 2022-03-10 11:37:13 +08:00 npm create vite@latest my-vue-app -- --template vanilla |
28 lin07hui 2022-03-10 11:38:06 +08:00 npm create vite@latest my-vanilla-ts-app -- --template vanilla-ts |
29 lblblong 2022-03-10 17:12:48 +08:00 试试 svelte ,看看我这个: https://github.com/lbl-tools/lbl-toast |
30 AlphaTr 2022-03-11 12:29:43 +08:00 vue-cli 也有库模式,支持 vue 的 inline 打包,应该可以的 vue-cli-service build --target lib --inline-vue |