当前位置: 首页 > article >正文

elpis的npm抽离与发布

前言话接上文在上一个学习阶段中elpis已经基本开发完成了具备了动态生成页面和组件的能力那么在这一章节中我们要做的就是把项目进行改造并发布到npm上去供大家进行使用附上我的npm包npm i yxcheng/augustus抽离过程一本地连接在发布之前我们需要先在本地进行调试这个命令是npm link所以我们需要在本地新建一个demo文件然后通过npm link xxx(此处为npm用户的名称包名) 进行连接二相关文件处理以controller为例当我们把elpis当做一个公共包来使用时我们需要注意的是不仅要挂载业务下的controller到app还需兼容自身的controller所以对如下代码进行改造module.exports (app) { const controller {}; // 读取augusts/controller/**/**.js目录下的文件 const augustsBusinessControllPath path.resolve( __dirname, ..${sep}..${sep}app${sep}controller, ); const augustsFileList glob.sync( path.resolve(augustsBusinessControllPath, .${sep}**${sep}**.js), ); augustsFileList.forEach((file) { handleFile(file); }); // 读取业务/controller/**/**.js目录下的文件 const businessControllPath path.resolve( app.businessPath, .${sep}controller, ); const businessFileList glob.sync( path.resolve(businessControllPath, .${sep}**${sep}**.js), ); businessFileList.forEach((file) { handleFile(file); }); // 把内容加载到app.controller下 function handleFile(file) { // 提取文件名 let name path.resolve(file); // 截取路径 app/controller/custom-module/custom-controller.js custom-module/custom-controller name name.substring( name.lastIndexOf(controller${sep}) controller${sep}.length, name.lastIndexOf(.), ); // 把’-‘统一改为驼峰式 name name.replace(/[_-][a-z]/gi, (s) s.substring(1).toUpperCase()); // 挂在controller到内存app对象中 let tempController controller; const names name.split(sep); for (let i 0, len names.length; i len; i) { if (i len - 1) { const ControllerMoule require(path.resolve(file))(app); tempController[names[i]] new ControllerMoule(); } else { if (!tempController[names[i]]) { tempController[names[i]] {}; } tempController tempController[names[i]]; } } } app.controller controller; };对于自身和即将使用的业务文件进行同样的处理包括extend.js,config.js,middleware.js,router-schema.js,router.js,service.js文件同样依次处理webpack部分的处理1.将 dev 和 prod 两个打包方式暴露出去然后项目就可以通过该函数去执行相应的打包方式const FEBuildDev require(./app/webpack/dev.js); const FEBuildProd require(./app/webpack/prod.js); module.exports { /** * 服务端基础 */ Controller: { Base: require(./app/controller/base.js), }, Service: { Base: require(./app/service/base.js), }, /** * 编译构建前端工程 * params env 环境变量 local/prod */ frontendBuild(env) { if (env local) { FEBuildDev(); } else if (env production) { FEBuildProd(); } }, };2.webpack.base的修改resolve: { extensions: [.js, .vue, .less, .css], alias: (() { const alaisMap {}; const blankModulePath path.resolve(__dirname, ../libs/blank.js); // dashboard路由拓展配置 const businessDashboardRouterConfig path.resolve( process.cwd(), ./app/pages/dashboard/router.js, ); alaisMap[$businessDashboardRouterConfig] fs.existsSync( businessDashboardRouterConfig, ) ? businessDashboardRouterConfig : blankModulePath; // schema-view component 扩展配置 const businessComponentConfig path.resolve( process.cwd(), ./app/pages/dashboard/complex-view/schema-view/components/component-config.js, ); alaisMap[$businessComponentConfig] fs.existsSync( businessComponentConfig, ) ? businessComponentConfig : blankModulePath; // schema-form 扩展配置 const businessFormItemConfig path.resolve( process.cwd(), ./app/pages/widgets/schema-form/form-item-config.js, ); alaisMap[$businessFormItemConfig] fs.existsSync( businessFormItemConfig, ) ? businessFormItemConfig : blankModulePath; // schema-search-bar 扩展配置 const businessSearchItemConfig path.resolve( process.cwd(), ./app/pages/widgets/schema-search-bar/search-item-config.js, ); alaisMap[$businessSearchItemConfig] fs.existsSync( businessSearchItemConfig, ) ? businessSearchItemConfig : blankModulePath; return { vue: require.resolve(vue), babel/runtime/regenerator: require.resolve(babel/runtime/regenerator), babel/runtime/helpers/asyncToGenerator: require.resolve(babel/runtime/helpers/asyncToGenerator), $elpisPages: path.resolve(__dirname, ../../pages), $elpisCommon: path.resolve(__dirname, ../../pages/common), $elpisCurl: path.resolve(__dirname, ../../pages/common/curl.js), $elpisUtils: path.resolve(__dirname, ../../pages/common/utils.js), $elpisWidgets: path.resolve(__dirname, ../../pages/widgets), $elpisHeaderContainer: path.resolve( __dirname, ../../pages/widgets/header-container/header-container.vue, ), $elpisSiderContainer: path.resolve( __dirname, ../../pages/widgets/sider-container/sider-container.vue, ), $elpisSchemaTable: path.resolve( __dirname, ../../pages/widgets/schema-table/schema-table.vue, ), $elpisSchemaForm: path.resolve( __dirname, ../../pages/widgets/schema-form/schema-form.vue, ), $elpisSchemaSearchBar: path.resolve( __dirname, ../../pages/widgets/schema-search-bar/schema-search-bar.vue, ), $elpisStore: path.resolve(__dirname, ../../pages/store), $elpisBoot: path.resolve(__dirname, ../../pages/boot.js), ...alaisMap, }; })(), },配置公共组件部分import createForm from ./create-form/create-form.vue; import editForm from ./edit-form/edit-form.vue; import detailPanel from ./detail-panel/detail-panel.vue; // 业务拓展component配置 import BusinessComponentConfig from $businessComponentConfig; const componentConfig { createForm: { component: createForm, }, editForm: { component: editForm, }, detailPanel: { component: detailPanel, }, }; export default { ...componentConfig, ...BusinessComponentConfig, };这里面改动的部分在于1. 路径别名修改使用之前的路径别名会定位到我们的业务目录下所以需要进行修改2. 由于我们的包中提供了自己的 loader 所以需要使用 require.resolve(相关loader) 包裹起来3. 配置外部公共组件由于我们需要提供给使用者一个扩展公共组件的方法因此除了原先 elpis 自带的公共组件路径外还需要配置一个能够读取项目(业务)公共组件路径的方法npm包发布1. 注册npm账号2. 查看是否具有镜像源如果存在则需要清空3. 登录npm并确认npm名4. 发布npm包// 查看镜像源 npm config get // 清空镜像源 npm config set registry // 登录 npm npm login //会给邮箱发送验证邮件 // 确定当前登录的 npm 账号和package.json里面的name是否对应 npm whoami // 发布 npm npm publish --access public // 公有化提交第一次提交需要进行公有化提交 npm publish一开始npm publish --access public一直403提交不上去查看是因为two-factor authentication查了一下自2025年底起npm 为了安全采取了两项关键措施1.废弃经典令牌传统的 npm login 方式或 Classic Token 已无法满足发布要求。1.强制2FA或等效方案所有粒度令牌Granular Token默认需要2FA验证。然而CLI工具只能接受来自验证器应用如 Google Authenticator的 TOTP 码无法使用 Security Key 或恢复码。这导致了一个矛盾即使您在网页端启用了2FA如果只配置了 Security Key 而未启用 TOTPCLI 发布依然会失败解决方法如下亲测有效生成正确的令牌- 登录 npmjs.com点击右上角头像进入 “Access Tokens”。- 点击 “Generate New Token” 对permission需要允许读写然后日期尽量长一点。-核心步骤务必勾选“Bypass two-factor authentication”选项。这是解决403错误的关键。- 生成并复制以 npm_ 开头的长字符串令牌只显示一次请妥善保存写入令牌执行 npm config set //registry.npmjs.org/:_authToken你的token执行完之后可以通过npm whoami验证是否生效能输出用户名说明 OK之后再npm publish --access public应该问题就没有了本文来源于抖音 哲玄 大前端全栈实践

相关文章:

elpis的npm抽离与发布

前言话接上文,在上一个学习阶段中,elpis已经基本开发完成了,具备了动态生成页面和组件的能力,那么,在这一章节中,我们要做的就是把项目进行改造,并发布到npm上去,供大家进行使用附上…...

基于单片机的LED电子显示屏的设计

收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…...

无人船USV轨迹跟踪+NMPC非线性模型预测+障碍物避碰Matlab程序(IEEE复现)

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...

嵌入式轻量级参数存储:带校验码与Code ID的EEPROM偏好管理

1. 项目概述CodedPreferences 是一个面向嵌入式系统的轻量级非易失性参数存储库,其核心设计目标是为资源受限的 MCU(如 STM32F0/F1/L0/L1、nRF52、ESP32-C3 等)提供具备编码校验能力的 EEPROM/Flash 偏好设置管理方案。与传统EEPROM.put()或裸…...

Alpamayo-R1-10B作品集:10组高难度长尾场景(鬼探头、视线遮挡、异形车辆)应对案例

Alpamayo-R1-10B作品集:10组高难度长尾场景(鬼探头、视线遮挡、异形车辆)应对案例 1. 项目概述 Alpamayo-R1-10B是专为自动驾驶研发设计的开源视觉-语言-动作(VLA)模型,基于100亿参数架构构建。该模型结合AlpaSim模拟器与Physic…...

GLM-OCR多模态识别模型:从零开始快速部署与测试

GLM-OCR多模态识别模型:从零开始快速部署与测试 你是不是经常需要从图片、扫描件或者PDF里提取文字?手动输入太慢,用在线工具又担心数据安全。今天要介绍的GLM-OCR,就是一个能让你彻底告别这些烦恼的解决方案。 GLM-OCR最近在权…...

C语言基础教学:Yi-Coder-1.5B辅助练习系统

C语言基础教学:Yi-Coder-1.5B辅助练习系统 1. 引言 学习C语言编程时,很多初学者都会遇到这样的困境:写出来的代码总是报错,但不知道错在哪里;想要改进代码,却不知道从何下手;想要练习编程&…...

Qwen-Image-2512-Pixel-Art-LoRA 社区挑战赛优秀作品展:“未来城市“主题

Qwen-Image-2512-Pixel-Art-LoRA 社区挑战赛优秀作品展:“未来城市”主题 最近,我们围绕 Qwen-Image-2512-Pixel-Art-LoRA 这个像素艺术模型,在社区里发起了一场名为“未来城市”的创作挑战赛。说实话,一开始我们心里也没底&…...

告别微信QQ!用群晖NAS+Vocechat搭建你的私人聊天室(附Cpolar内网穿透教程)

打造完全自主的私有化聊天系统:群晖NASVocechat实战指南 在数字化生活日益深入的今天,我们的聊天记录、文件传输和个人数据正被越来越多的第三方平台所掌握。你是否曾因微信聊天记录无法跨设备同步而困扰?是否担心重要商业对话被存储在不可控…...

HY-MT1.5-7B常见问题解答:翻译不稳定与temperature设置技巧

HY-MT1.5-7B常见问题解答:翻译不稳定与temperature设置技巧 1. 翻译不稳定的常见原因分析 1.1 模型随机性与temperature参数 HY-MT1.5-7B作为生成式大语言模型,其翻译结果天然带有一定随机性。这种特性由temperature参数控制: 低temperat…...

ArcGIS实战:如何用Moran’s指数分析城市收入分布(附完整操作步骤)

ArcGIS实战:用Moran’s指数解析城市收入空间格局 城市收入分布往往隐藏着空间密码。当高收入家庭在特定区域聚集,而低收入群体形成另一个中心时,这种空间分异现象会直接影响公共服务配置、商业布局甚至社区活力。作为城市规划师或GIS分析师&a…...

LeNet-5实战:用TensorFlow 2.6复现经典CNN手写数字识别(附完整代码)

LeNet-5实战:从经典架构到TensorFlow 2.6的现代实现 1. 认识LeNet-5:CNN领域的里程碑 1998年,Yann LeCun团队提出的LeNet-5架构在支票手写数字识别任务中取得了突破性成果,错误率低至1%以下。这个仅有7层(2卷积2池化…...

VVC编码实战:用VTM测试H.266性能时最容易忽略的5个配置文件陷阱

VVC编码实战:用VTM测试H.266性能时最容易忽略的5个配置文件陷阱 当你在Fraunhofer VTM工具链中测试H.266/VVC编码性能时,配置文件就像隐藏在幕后的导演,悄无声息地决定着整个测试的成败。很多工程师花费大量时间调试算法,却因为几…...

Leetcode 144 位1的个数 | 只出现一次的数字

1 题目 191. 位1的个数 给定一个正整数 n,编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数(也被称为汉明重量)。 示例 1: 输入:n 11 输出:3 解释&#xff1…...

VS2019编译的QT程序,如何用windeployqt和Dependency Walker双工具精准‘瘦身’打包?

VS2019编译的QT程序:用windeployqt和Dependency Walker实现精准依赖分析与极简打包 在开发跨平台的QT应用程序时,打包发布往往是一个容易被忽视却又至关重要的环节。特别是当项目依赖多个大型第三方库(如VTK、OpenCV等)时&#xf…...

MCP23017 I²C端口扩展器原理与IPOL极性反转实战

1. MCP23017 IC端口扩展器深度技术解析 MCP23017是Microchip公司推出的16位IC总线可编程GPIO端口扩展器,广泛应用于STM32、ESP32、Raspberry Pi等嵌入式平台的外设资源扩展场景。其核心价值在于以极低的硬件开销(仅需2根IC信号线)实现16个双向…...

深入解析monaco-editor滚动条异常:从scrollBeyondLastLine配置到编辑器视口渲染优化

1. 为什么monaco-editor会出现多余的滚动条? 第一次使用monaco-editor时,很多开发者都会遇到这个奇怪的现象:明明编辑器内容很少,连容器高度的一半都没占满,右侧却莫名其妙出现了滚动条,拖动时还会显示大片…...

Qwen3-0.6B-FP8极速对话工具:Git版本控制智能助手

Qwen3-0.6B-FP8极速对话工具:Git版本控制智能助手 1. 引言 你有没有遇到过这样的情况:正在紧急修复线上 bug,突然发现代码冲突了,手忙脚乱地查文档、问同事,结果耽误了宝贵时间?或者刚接触 Git&#xff0…...

PHP项目中如何快速生成专业级二维码?Endroid QR Code终极解决方案

PHP项目中如何快速生成专业级二维码?Endroid QR Code终极解决方案 【免费下载链接】qr-code QR Code Generator 项目地址: https://gitcode.com/gh_mirrors/qr/qr-code 在PHP应用开发中,二维码生成功能已成为营销推广、支付集成、身份验证等场景的…...

用PyTorch实战PINN:手把手教你搞定Navier-Stokes方程逆问题(附完整代码)

用PyTorch实战PINN:从零构建Navier-Stokes方程求解器 在计算流体力学领域,Navier-Stokes方程的求解一直是工程师和科研人员面临的挑战。传统数值方法如有限体积法需要复杂的网格划分,而物理信息神经网络(PINN)提供了一种全新的无网格求解范式…...

避开Docker陷阱:Mac上正确安装Node Exporter的两种方法对比

Mac上高效部署Node Exporter的深度实践指南 在Mac环境下部署监控工具时,Node Exporter因其轻量级和全面的系统指标采集能力成为许多开发者的首选。但不同于Linux系统的一键式安装,Mac用户往往面临两种截然不同的安装路径选择——手动安装与Docker容器化部…...

告别手动字幕制作:OpenLRC让AI为你自动生成精准同步歌词

告别手动字幕制作:OpenLRC让AI为你自动生成精准同步歌词 【免费下载链接】openlrc Transcribe and translate voice into LRC file using Whisper and LLMs (GPT, Claude, et,al). 使用whisper和LLM(GPT,Claude等)来转录、翻译你的音频为字幕文件。 项…...

【图文教程】C盘满了怎么清理? | Win10/W11电脑系统C盘清理教程|远离C盘变红爆红 |10种清理C盘的安全方法 |C盘清理工具

当你打开电脑,系统不断弹出“C盘空间不足”的警告时,电脑运行明显变慢、软件卡顿、文件保存失败,甚至系统更新也无法安装。这时就该行动了! C盘满了怎么清理? 这 10种安全有效的清理方法,涵盖 Win10 / Win1…...

汇川中型PLC纯ST语言双轴同步设备程序

汇川中型plc+纯ST语言双轴同步设备,程序中没有使用任何库文件,纯原生codesys功能块。 非常适合初学入门者,三个虚拟驱动模拟虚主轴和两个伺服从轴,只要手里有汇川AM400,600,AC700,800即可实际运行该项目程序…...

小白必看!Holistic Tracking镜像快速入门:上传照片秒得全息骨骼

小白必看!Holistic Tracking镜像快速入门:上传照片秒得全息骨骼 1. 什么是Holistic Tracking? Holistic Tracking是一项革命性的人体感知技术,它能从一张普通照片中同时捕捉你的面部表情、手势动作和身体姿态。想象一下&#xf…...

快速部署AI头像生成器:Gradio界面一键使用,无需配置

快速部署AI头像生成器:Gradio界面一键使用,无需配置 1. 为什么你需要这个AI头像生成器? 在数字社交时代,一个精心设计的头像能显著提升个人或品牌的第一印象。但现实中,我们常面临这些困扰: 翻遍相册找不…...

万象熔炉丹青幻境打造个人品牌:快速生成Logo与视觉素材实战

万象熔炉丹青幻境打造个人品牌:快速生成Logo与视觉素材实战 1. 为什么个人品牌需要专业视觉设计 在当今数字化时代,视觉形象已经成为个人品牌不可或缺的一部分。无论是自由职业者、内容创作者还是小微企业主,一个专业的Logo和统一的视觉风格…...

ESP32+freeRTOS实战:从裸机开发到多任务协作的平滑过渡指南

ESP32freeRTOS实战:从裸机开发到多任务协作的平滑过渡指南 当你在ESP32上完成几个简单的LED闪烁和传感器读取项目后,可能会发现裸机开发的局限性越来越明显——那个经典的while(1)循环开始变得臃肿,各种延时函数阻塞了整个系统,而…...

Clawdbot整合Qwen3:32B实战体验:AI代理网关部署与聊天界面使用

Clawdbot整合Qwen3:32B实战体验:AI代理网关部署与聊天界面使用 1. 初识Clawdbot:AI代理网关的核心价值 在当今AI应用开发中,开发者经常面临一个共同挑战:如何高效管理和集成多个AI模型。Clawdbot的出现,正是为了解决…...

QNX系统线程优先级实战:如何避免嵌入式开发中的调度陷阱?

QNX线程优先级实战:嵌入式开发中的调度优化与陷阱规避 在嵌入式系统开发领域,QNX以其微内核架构和实时性能著称,而线程优先级调度机制正是其核心优势之一。然而,这也是一把双刃剑——不当的优先级设置可能导致系统性能下降、响应延…...