iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何创建并发布npm包
  • 231
分享到

如何创建并发布npm包

2023-07-04 18:07:13 231人浏览 八月长安
摘要

这篇文章主要介绍“如何创建并发布npm包”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何创建并发布npm包”文章能帮助大家解决问题。工具库准备创建一个新项目,包含package.JSON{&nbs

这篇文章主要介绍“如何创建并发布npm包”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何创建并发布npm包”文章能帮助大家解决问题。

工具库准备

创建一个新项目,包含package.JSON

{    "name": "drrq",    "type": "module",    "version": "1.0.0"}

功能实现 /src/index.js

npm i qs axiOS

主要思路是用请求的url和参数作为key记录请求队列,当出现重复请求时,打断后面的请求,将前面的请求结果返回时共享给后面的请求。

import qs from "qs";import axios from "axios";let pending = []; //用于存储每个ajax请求的取消函数和ajax标识let task = {}; //用于存储每个ajax请求的处理函数,通过请求结果调用,以ajax标识为key//请求开始前推入pendinGConst pushPending = (item) => {    pending.push(item);};//请求完成后取消该请求,从列表删除const removePending = (key) => {    for (let p in pending) {        if (pending[p].key === key) {            //当前请求在列表中存在时            pending[p].cancelToken(); //执行取消操作            pending.splice(p, 1); //把这条记录从列表中移除        }    }};//请求前判断是否已存在该请求const existInPending = (key) => {    return pending.some((e) => e.key === key);};// 创建taskconst createTask = (key, resolve) => {    let callback = (response) => {        resolve(response.data);    };    if (!task[key]) task[key] = [];    task[key].push(callback);};// 处理taskconst handleTask = (key, response) => {    for (let i = 0; task[key] && i < task[key].length; i++) {        task[key][i](response);    }    task[key] = undefined;};const getHeaders = { 'Content-Type': 'application/json' };const postHeaders = { 'Content-Type': 'application/x-www-fORM-urlencoded' };const fileHeaders = { 'Content-Type': 'multipart/form-data' };const request = (method, url, params, headers, preventRepeat = true, uploadFile = false) => {    let key = url + '?' + qs.stringify(params);    return new Promise((resolve, reject) => {        const instance = axios.create({            baseURL: url,            headers,            timeout: 30 * 1000,        });        instance.interceptors.request.use(            (config) => {                if (preventRepeat) {                    config.cancelToken = new axios.CancelToken((cancelToken) => {                        // 判断是否存在请求中的当前请求 如果有取消当前请求                        if (existInPending(key)) {                            cancelToken();                        } else {                            pushPending({ key, cancelToken });                        }                    });                }                return config;            },            (err) => {                return Promise.reject(err);            }        );        instance.interceptors.response.use(            (response) => {                if (preventRepeat) {                    removePending(key);                }                return response;            },            (error) => {                return Promise.reject(error);            }        );        // 请求执行前加入task        createTask(key, resolve);        instance(Object.assign({}, { method }, method === 'post' || method === 'put' ? { data: !uploadFile ? qs.stringify(params) : params } : { params }))            .then((response) => {                // 处理task                handleTask(key, response);            })            .catch(() => {});    });};export const get = (url, data = {}, preventRepeat = true) => {    return request('get', url, data, getHeaders, preventRepeat, false);}; export const post = (url, data = {}, preventRepeat = true) => {     return request('post', url, data, postHeaders, preventRepeat, false); }; export const file = (url, data = {}, preventRepeat = true) => {     return request('post', url, data, fileHeaders, preventRepeat, true); };export default { request, get, post, file };

新增示例代码文件夹/example

示例入口index.js

import { exampleRequestGet } from './api.js';const example = async () => {    let res = await exampleRequestGet();    console.log('请求成功 ');};example();

api列表api.js

import { request } from './request.js';// 示例请求Getexport const exampleRequestGet = (data) => request('get', '/xxxx', data);// 示例请求Postexport const exampleRequestPost = (data) => request('post', '/xxxx', data);// 示例请求Post 不去重export const exampleRequestPost2 = (data) => request('post', '/xxxx', data, false);// 示例请求Post 不去重export const exampleRequestFile = (data) => request('file', '/xxxx', data, false);

全局请求封装request.js

import drrq from '../src/index.js';const baseURL = 'https://xxx';// 处理请求数据  (拼接url,data添加token等) 请根据实际情况调整const paramsHandler = (url, data) => {    url = baseURL + url;    data.token = 'xxxx';    return { url, data };};// 处理全局接口返回的全局处理相关逻辑  请根据实际情况调整const resHandler = (res) => {    // TODO 未授权跳转登录,状态码异常报错等    return res;};export const request = async (method, _url, _data = {}, preventRepeat = true) => {    let { url, data } = paramsHandler(_url, _data);    let res = null;    if (method == 'get' || method == 'GET' || method == 'Get') {        res = await drrq.get(url, data, preventRepeat);    }    if (method == 'post' || method == 'POST' || method == 'Post') {        res = await drrq.post(url, data, preventRepeat);    }    if (method == 'file' || method == 'FILE' || method == 'file') {        res = await drrq.file(url, data, preventRepeat);    }    return resHandler(res);};

测试功能

代码写完后,我们需要验证功能是否正常,package.json加上

    "scripts": {        "test": "node example"    },

执行npm run test

如何创建并发布npm包

功能正常,工具库准备完毕。

(eslint和prettier读者可视情况选用)

打包

一般项目的打包使用webpack,而工具库的打包则使用rollup

安装 Rollup

通过下面的命令安装 Rollup:

npm install --save-dev rollup

创建配置文件

在根目录创建一个新文件 rollup.config.js

export default {  input: "src/index.js",  output: {    file: "dist/drrp.js",    format: "esm",    name: 'drrp'  }};

  • input —— 要打包的文件

  • output.file —— 输出的文件 (如果没有这个参数,则直接输出到控制台)

  • output.format —— Rollup 输出的文件类型

安装babel

如果要使用 es6 的语法进行开发,还需要使用 babel 将代码编译成 es5。因为rollup的模块机制是 ES6 Modules,但并不会对 es6 其他的语法进行编译。

安装模块

rollup-plugin-babel 将 rollup 和 babel 进行了完美结合。

npm install --save-dev rollup-plugin-babel@latestnpm install --save-dev @babel/core npm install --save-dev @babel/preset-env

根目录创建 .babelrc

{    "presets": [      [        "@babel/preset-env",        {          "modules": false        }      ]    ]}

兼容 commonjs

rollup 提供了插件 rollup-plugin-commonjs,以便于在 rollup 中引用 commonjs 规范的包。该插件的作用是将 commonjs 模块转成 es6 模块。

rollup-plugin-commonjs 通常与 rollup-plugin-node-resolve 一同使用,后者用来解析依赖的模块路径。

安装模块

npm install --save-dev rollup-plugin-commonjs rollup-plugin-node-resolve

压缩 bundle

添加 UglifyJS 可以通过移除注上释、缩短变量名、重整代码来极大程度的减少 bundle 的体积大小 —— 这样在一定程度降低了代码的可读性,但是在网络通信上变得更有效率。

安装插件

用下面的命令来安装 rollup-plugin-uglify:

npm install --save-dev rollup-plugin-uglify

完整配置

rollup.config.js 最终配置如下

import resolve from 'rollup-plugin-node-resolve';import commonjs from 'rollup-plugin-commonjs';import babel from 'rollup-plugin-babel';import { uglify } from 'rollup-plugin-uglify';import json from '@rollup/plugin-json'const paths = {    input: {        root:  'src/index.js',    },    output: {        root:  'dist/',    },};const fileName = `drrq.js`;export default {    input: `${paths.input.root}`,    output: {        file: `${paths.output.root}${fileName}`,        format: 'esm',        name: 'drrq',    },    plugins: [        json(),        resolve(),        commonjs(),        babel({            exclude: 'node_modules/**',            runtimeHelpers: true,        }),        uglify(),    ],};

在package.json中加上

"scripts": {    "build": "rollup -c"},

即可执行npm run build将/src/index.js打包为/dist/drrq.js

发包前的准备

准备npm账号,通过npm login或npm adduser。这里有一个坑,终端内连接不上npm源,需要在上网工具内复制终端代理命令后到终端执行才能正常连接。

如何创建并发布npm包

准备一个简单清晰的readme.md

如何创建并发布npm包

修改package.json

完整的package.json如下

{    "name": "drrq",    "private": false,    "version": "1.3.5",    "main": "/dist/drrq.js",    "repository": "Https://gitee.com/yuanying-11/drrq.git",    "author": "it_yuanying",    "license": "MIT",    "description": "能自动取消重复请求的axios封装",    "type": "module",    "keyWords": [        "取消重复请求",    ],    "dependencies": {        "axios": "^1.2.0",        "qs": "^6.11.0"    },    "scripts": {        "test": "node example",        "build": "rollup -c"    },    "devDependencies": {       ...    }}

  • name 包名称 一定不能与npm已有的包名重复,想一个简单易记的

  • private 是否为私有

  • version 版本

  • main 入口文件位置

  • repository git仓库地址

  • author 作者

  • license 协议

  • description 描述

  • keywords 关键词,便于检索

每个 npm 包都需要一个版本,以便开发人员在安全地更新包版本的同时不会破坏其余的代码。npm 使用的版本系统被叫做 SemVer,是 Semantic Versioning 的缩写。

不要过分担心理解不了相较复杂的版本名称,下面是他们对基本版本命名的总结:给定版本号 MAJOR.MINOR.PATCH,增量规则如下:

  • MAJOR 版本号的变更说明新版本产生了不兼容低版本的 API 等,

  • MINOR 版本号的变更说明你在以向后兼容的方式添加功能,接下来

  • PATCH 版本号的变更说明你在新版本中做了向后兼容的 bug 修复。

表示预发布和构建元数据的附加标签可作为 MAJOR.MINOR.PATCH 格式的扩展。

最后,执行npm publish就搞定啦

如何创建并发布npm包

如何创建并发布npm包

关于“如何创建并发布npm包”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: 如何创建并发布npm包

本文链接: https://www.lsjlt.com/news/346837.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何创建并发布npm包
    这篇文章主要介绍“如何创建并发布npm包”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何创建并发布npm包”文章能帮助大家解决问题。工具库准备创建一个新项目,包含package.json{&nbs...
    99+
    2023-07-04
  • 手把手带你从0开始创建并发布npm包
    最后,执行npm publish就搞定啦本文的完整代码已开源至gitee.com/yuanying-11… ,感兴趣的读者欢迎fork和star!转载地址:https://juejin.cn/post/7172240485778456606...
    99+
    2023-05-14
    nodejs​ node npm
  • 如何发布一个 NPM 包
    首先初始化: npm init 文件夹结构 .gitignore Git 库忽略文件清单.npmignore 不包括在 npm 注册库中的文件清单LECENSE 模块的授权文件README.md 说明...
    99+
    2023-10-10
    npm 前端 node.js
  • node文件如何写成npm包并发布出去
    这篇文章主要介绍了node文件如何写成npm包并发布出去,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。把node文件拷贝写成npm包,并发布...
    99+
    2024-04-02
  • vue组件打包并发布到npm的全过程
    目录一、创建项目二、配置相关文件1.修改文件名2.根目录下新建 vue.config.js文件3.发布到npm总结一、创建项目 vue create 项目名称二、配置相关文件 1.修...
    99+
    2023-01-13
    vue组件 vue组件打包 vue组件发布到npm
  • webpack如何创建项目并打包
    这篇文章主要介绍“webpack如何创建项目并打包”,在日常操作中,相信很多人在webpack如何创建项目并打包问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”webpack如何创建项目并打包”的疑惑有所帮助!...
    99+
    2023-07-05
  • 如何创建 PHP 函数库并将其发布到 Packagist 上?
    如何创建 PHP 函数库并将其发布到 Packagist 上 1. 创建函数库 首先,创建一个新的 PHP 项目并使用 Composer 来管理依赖关系:<a style='co...
    99+
    2024-04-27
    php git composer access
  • 如何创建和发布Python模块
    已有 7514 次阅读 2013-1-3 22:22 |个人分类:学习生活|系统分类:科研笔记|关键词:Python 发布 模块 Windows 1. 首先将你要发布的模块(函数)写在一个Python文件里,即以*.py的文件...
    99+
    2023-01-31
    模块 Python
  • linux如何使用Snapcraft构建、测试并发布Snap软件包
    这篇文章主要介绍linux如何使用Snapcraft构建、测试并发布Snap软件包,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!snapcraft 是一个正在为其在 Linux  中的地位而奋斗的包管理系统...
    99+
    2023-06-16
  • Go并发和npm打包:如何平衡性能和开发效率?
    随着互联网技术的不断发展,软件开发已经成为了人们日常工作中不可或缺的一部分。在软件开发中,性能和开发效率一直是开发者最为关注的问题之一。在本文中,我们将探讨Go并发和npm打包,以及如何在二者之间平衡性能和开发效率。 Go是一种快速的编程语...
    99+
    2023-08-26
    并发 npm 打包
  • 如何用vue-cli创建项目并webpack打包
    本篇内容介绍了“如何用vue-cli创建项目并webpack打包”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2024-04-02
  • 如何在Go中实现并发?npm打包是否可行?
    Go语言是一门高效、可靠且易于编写并发程序的语言。Go语言中提供了丰富的并发编程机制,包括goroutine和channel等,这些机制可以帮助我们更好地利用多核CPU,提高程序的性能。本文将介绍如何在Go语言中实现并发,并探讨npm打包...
    99+
    2023-08-26
    并发 npm 打包
  • 如何在Go中使用npm包并发生成二维码?
    Go是一种强类型的编程语言,它已经成为了许多开发人员的首选。Go的并发特性让它成为一个非常有用的工具,尤其是在需要高并发处理的项目中。而npm是一个非常流行的包管理器,它可以帮助我们快速地获取并使用其他开发者开发的包。在本文中,我们将介绍如...
    99+
    2023-09-01
    二维码 npm 并发
  • Java并发编程如何创建并运行线程
    这篇文章主要介绍“Java并发编程如何创建并运行线程”,在日常操作中,相信很多人在Java并发编程如何创建并运行线程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发编程如何创建并运行线程”的疑惑有所...
    99+
    2023-06-29
  • 如何创建 PHP 函数库并将其打包为 Composer 包?
    要创建并打包 php 函数库为 composer 包,请遵循以下步骤:创建函数库文件。定义 composer 信息。初始化 composer 包。将函数库添加到包中。创建源代码文件夹。打...
    99+
    2024-04-28
    php composer
  • HTML5如何创建画布
    这篇文章主要介绍了HTML5如何创建画布的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇HTML5如何创建画布文章都会有所收获,下面我们一起来看看吧。   1. 创建画布  ...
    99+
    2024-04-02
  • Oracle触发器和程序包如何创建
    今天小编给大家分享一下Oracle触发器和程序包如何创建的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、触发器的概念1、触...
    99+
    2023-07-02
  • 如何使用vue-cli创建项目并webpack打包
    这篇文章主要介绍“如何使用vue-cli创建项目并webpack打包”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用vue-cli创建项目并webpack打包...
    99+
    2024-04-02
  • 如何利用Node.js为Node.js生成HttpStatusCode辅助类并发布到npm
    本篇内容介绍了“如何利用Node.js为Node.js生成HttpStatusCode辅助类并发布到npm”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处...
    99+
    2024-04-02
  • 如何使用Go和Apache打包并发布Git代码?
    Git是目前最流行的版本控制系统之一,而Go语言则是一种高效的编程语言。本文将介绍如何使用Go和Apache打包并发布Git代码。 1.安装Go 首先,您需要安装Go。可以从官方网站https://golang.org/下载最新版本的Go...
    99+
    2023-11-04
    apache 打包 git
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作