惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
罗磊的独立博客
H
Help Net Security
I
Intezer
G
Google Developers Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
Troy Hunt's Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
U
Unit 42
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
N
News and Events Feed by Topic
J
Java Code Geeks
S
Security Affairs
T
The Blog of Author Tim Ferriss
Recent Commits to openclaw:main
Recent Commits to openclaw:main
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
D
Docker
The GitHub Blog
The GitHub Blog
F
Full Disclosure
N
News and Events Feed by Topic
Webroot Blog
Webroot Blog
S
Security @ Cisco Blogs
腾讯CDC
人人都是产品经理
人人都是产品经理
M
MIT News - Artificial intelligence
Blog — PlanetScale
Blog — PlanetScale
T
Threatpost
D
DataBreaches.Net
Recent Announcements
Recent Announcements
博客园 - 三生石上(FineUI控件)
MongoDB | Blog
MongoDB | Blog
博客园 - 【当耐特】
L
LINUX DO - 最新话题
Google Online Security Blog
Google Online Security Blog
S
Schneier on Security
S
Securelist
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Help Net Security
Help Net Security
P
Proofpoint News Feed
Project Zero
Project Zero
S
SegmentFault 最新的问题
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MyScale Blog
MyScale Blog
Google DeepMind News
Google DeepMind News
宝玉的分享
宝玉的分享
Y
Y Combinator Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 叶小钗

博客园 - 进军的蜗牛

浏览器音频入门:录音生成 PCM、单声道/立体声、采样率、转 MP3 Web 语音场景下多路麦克风采集与音量异常:成因与两种工程取舍 从一次权限错误,彻底搞懂Mac权限管理那些事 js实现svga编辑器 Chrome浏览器普通模式访问页面报错 ERR_CONNECTION_REFUSED 问题排查 Web语音聊天室中录音无声问题分析与解决方案 蓝湖SVG上传Iconfont阿里图标库部分元素缺失问题分析与解决方案 前端测试新体验:Cypress让UI测试变得如此简单 iOS H5页面高度闪烁问题与100vh兼容性详解 为什么录音生成的音频文件有时长但没声音?—— 一次音频采集问题的排查与解决 前端实现采集图片某个区域的颜色色值 浏览器多Tab间通信方法全面总结:从WebView需求出发的技术方案 pcm文件转为mp3并播放 github https方式 push无法提交代码的处理方法 前端如何计算js代码执行时长 基于swiper和animate.css的全屏H5动效和花瓣飘落效果 混合开发H5页面的数字字体在IOS 安卓上显示不一样 node基于自签名证书搭建https服务 ios系统上h5页面点击播放audio标签声音有延迟问题处理 CSS运动路径offset-path之path的语法解析
基于svelte webpack开发umd格式的npm包
进军的蜗牛 · 2024-03-29 · via 博客园 - 进军的蜗牛

原文链接: https://www.cnblogs.com/yalong/p/18101609

背景:

平常会接触到vuereactjquery项目,项目中有一些公共组件其实是可以复用的,但是在vue项目中封装好的组件,在react中又不能用;
于是想找个方法,实现一次开发,多框架复用,调研发现svelte正好符合这个要求, 把组件封装成npm发布出去,其他项目使用的时候会更加方便;
为了在jquery项目中也使用封装好的npm组件,所以需要把npm打包成umd的规范

演示项目地址:

webpack全部配置,也都在这项目里
https://github.com/YalongYan/svelte-npm-test

关键步骤

一、创建index.js

index.js 文件就是引入组件,并导出,作为npm包的入口文件;
注意index.js不是项目启动时候的main.jsmain.js 是把组件挂载到body上运行, index.js 只是把组件导出

二、webpack打包入口区分

我这里配置了两个打包命令 npm run build npm run build-npm, 主要是传了NPM_ENV 参数,用这个参数来区分,webpack打包的入口文件
webpack 的入口配置如下:

entry: {
		bundle: [
			...stylesheets,
			npm_mode == '1' ? './src/index.js' : './src/main.js'
		]
	},

项目本地启动 和 正常build 的时候都是使用 main.js, 只有打包成npm的时候 使用index.js

三、webpack产出代码配置

npm要想打包成umd格式的代码,需要在output里添加, library libraryTarget umdNamedDefine 三个字段,代码如下

output: {
		path: path.resolve(__dirname, 'public/build'),
		publicPath: '/build/',
		filename: '[name].js',
		chunkFilename: '[name].[id].js',
		library: 'YylSvelteNpm', //类库名称
        libraryTarget: 'umd', //类库加载方式
        umdNamedDefine: true
},

四、配置package.json

主要有下面几个配置

  "private": false, 
  "version": "0.0.1",
  "description": "基于svelte开发npm",
  "author": "yyl",
  "main": "public/build/bundle.js",
  "name": "yyl-svelte-npm",
  • private 必须设置为false, 不然发布到npm别人也看不到这个包
  • version 版本号,每次发布的时候 都需要修改版本,如果版本跟线上一样的话,会导致发布不上去
  • description 描述,可以加一些自己相加的描述
  • author 作者名字
  • main npm 入口文件
  • name npm上显示的名字

在Vue中使用打包后的npm

  • npm i yyl-svelte-npm -S // 安装npm包
  • import YlSvelteTest from 'yl-svelte-test' // 导入包
  • new YlSvelteTest({
    target: document.getElementById('aaaa')
    }) // 把组件挂载到一个div上,该div的id为aaaa

vue文件代码如下:

<template>
  <img alt="Vue logo" src="./assets/logo.png">
  <HelloWorld msg="Welcome to Your Vue.js App"/>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'
import YylSvelteTest from 'yyl-svelte-npm'

export default {
  name: 'App',
  components: {
    HelloWorld
  },
  mounted() {
      setTimeout(() => {
        new YylSvelteTest({
          target:  document.getElementById('aaaa')
        })
      }, 2000);
  }
}
</script>

注意:<div id="aaaa"></div> 不能放在一个异步组件里,否则会找不到,导致报错 我这里直接放在里 index.html 里了
如下就是运行的效果,红色框内 就是npm组件:

在Jquery项目中使用

1. 在index.html 中像引用jquery.js 那样引用webpack打包好的js, 如下:

<script src="https://abc.com/test/yyl-svelte-npm.js"></script>

2. 具体使用的代码如下:
    const topRow2 = $('#aaaa')[0] // 这里必须加上[0]
    new window.YylSvelteNpm.default({target: topRow2});

或者换成一行如下所示:

new window.YylSvelteNpm.default({target: document.getElementById('aaaa')});

注意:不要忘了 idaaaadiv 元素

npm 发布相关命令

  1. npm 官网地址:https://www.npmjs.com/
  2. npm login 登录npm
  3. npm publish 发布到npm仓库
  4. npm who i am 查看当前登录的账号名字

注意点

  1. 记得需要单独引用样式文件,打包后的样式文件跟bundle.js在一块的
  2. 在package.json中添加 "files": ["./public"], 可以限制只把打包的代码上传到npm,避免源码上传和泄露

总结

  1. 使用svelte webpack生成umd 规范的npm 可以在不同框架之间公用,可以提高开发效率
  2. svelte本身相比vue、react会更轻量化,打包后的产物代码量更少而且还没有使用vdom,运行效率也会更高