首页 > 其他分享 >基于svelte webpack开发umd格式的npm包

基于svelte webpack开发umd格式的npm包

时间:2024-03-29 09:04:52浏览次数:19  
标签:npm index js umd webpack svelte 打包

原文链接: 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,运行效率也会更高

标签:npm,index,js,umd,webpack,svelte,打包
From: https://www.cnblogs.com/yalong/p/18101609

相关文章

  • webpack快速上手
    针对仅有js文件设置打包入口和出口constpath=require('path')module.exports={entry:'./src/main.js',output:{filename:'bundle.js',path:path.join(__dirname,'output')}}package.json的scripts增加如下"build......
  • 面试题——为什么vite打包速度比webpack快
    vite采用了不同的开发模式, 相较于webpack的先打包再启动服务器, vite则是直接启动, 在请求模块时再进行实时编译, 在大型项目中, 这种按需动态编译的模式极大地缩短了时间vite充分利用了现代浏览器对ESModules的支持, 将开发环境下的模块文件直接作为浏览器要执......
  • webpack 3 入门笔记
    生产/开发环境生产环境便于开发求方便开发环境便于部署求小体积小项目:用环境名if(evn===proudtion){}else{}大项目:dev(mergecommon),prod(mergecommon)三个文件通过script指令rundev和runbuild--config不同的配置文件。****开发环境:1公共变量2tr......
  • npm run dev 和 npm run serve 区别
    在日常运行vue项目中在终端运行命令有时用到npmrunserve有时是npmrundev。那么,什么时候用到serve,什么时候用到dev呢?他们的区别是什么?一般在vue3.x的时候用npmrunserve,vue2.x项目运行的时候用到npmrundev,dev是vuecli2的默认执行命令,serve是vuecli4的......
  • webpack入门2
    插件机制自动处理某些事情,而loader只是转换文件成js.webpack也为插件提供了平台,当然也可以自己修改默认配置plugin.config.js.比loader命题机制更广,plugin自定实现某些功能。利用class()的钩子。webpack的开发环境1http环境:可以看到页面。liveserverDEserverhttpServe......
  • npm cache clean --force
    根据错误信息,gyp在执行node-p"require('node-addon-api').include"时返回了退出代码1,并在binding.gyp文件中出现了错误。这种情况可能是由于构建过程中缺少必要的依赖项或工具链导致的。以下是一些可能的解决方案:确保您的系统已正确安装了Node.js的相关构建工具。您......
  • npm ERR! path /Users/apple/.npm/_cacache/index-v5/11/77/cf18d9ab54d565b57fb3
    在使用npm时,有时候您可能会遇到类似以下错误的权限问题:npmERR!path/Users/apple/.npm/_cacache/index-v5/11/77/cf18d9ab54d565b57fb3npmERR!codeEACCESnpmERR!errno-13npmERR!syscallopennpmERR!Error:EACCES:permissiondenied,open'/Users/apple/......
  • nexus 代理 npm
    环境说明服务ip端口备注nexus192.168.80.129(内网)8081内网地址无法访问外网nginx192.168.80.128(内网)192.168.174.126(外网)代理端口88192.168.174.126地址可以访问外网创建 BlobStores创建Repositories设置proxyrepo测试安装cnp......
  • webpack 入门笔记1
    webpack是一个综合性平台1为npm环境-packjson->依赖->依赖的编译器环境bale-->esj->程序.构建一个综合平台。2开发目录到生产目录;3打包优化将上百个依赖整合为若干chunk.提升下载速度.综合总线打通步骤1(node环境已下载)建立npm环境-与本地的链接npminit指令......
  • webpack loader和 plugin 实现原理
    1.webpack打包基本原理webpack的一个核心功能就是把我们写的模块化的代码,打包之后,生成可以在浏览器中运行的代码,我们这里也是从简单开始,一步步探索webpack的打包原理1.1一个简单的需求我们首先建立一个空的项目,使用npminit-y快速初始化一个package.json,然后安装webpa......