Jadual Kandungan
Latar Belakang
Persediaan perpustakaan alat
Pelaksanaan fungsi/src/index.js
Tambah contoh folder/contoh kod
Fungsi ujian
Pembungkusan
Pasang Rollup
Pasang babel
Modul pemasangan
Serasi dengan commonjs
Compress bundle
完整配置
发包前的准备
准备一个简单清晰的readme.md
修改package.json
Rumah hujung hadapan web tutorial js Membawa anda langkah demi langkah untuk mencipta dan menerbitkan pakej npm dari awal

Membawa anda langkah demi langkah untuk mencipta dan menerbitkan pakej npm dari awal

Dec 08, 2022 pm 08:26 PM
nodejs​ node npm

Sudah 2202, adakah sesiapa yang masih tidak tahu cara menerbitkan pakej npm? Artikel berikut akan berkongsi dengan anda keseluruhan proses mencipta dan menerbitkan npm dari awal saya harap ia akan membantu anda!

Membawa anda langkah demi langkah untuk mencipta dan menerbitkan pakej npm dari awal

Latar Belakang

Sebuah artikel telah diterbitkan pada bulan April, Datang dan tingkatkan pakej axios dalam projek anda, kepada Berulang permintaan mengucapkan selamat tinggal, memperkenalkan enkapsulasi sekunder axios untuk menyokong permintaan biasa dan permintaan tersuai, dan memintas permintaan yang sama dalam masa yang sama (jika anda belum membaca artikel ini, adalah disyorkan agar anda luangkan masa 3 minit untuk memahaminya secara kasar). Kebetulan saya sedang bersiap untuk menulis perpustakaan komponen merentas rangka kerja baru-baru ini (beban kerja sangat berat, dan tiga rakan front-end sedang mengerjakannya pada masa lapang mereka. Mereka akan berkongsinya dengan semua orang selepas perpustakaan komponen selesai, jadi tunggu). Saya perlu belajar menerbitkan pakej npm Semalam saya terfikir untuk menggunakan masa lapang saya untuk menerbitkan pakej axios yang saya tulis sebelum ini untuk mengalih keluar permintaan pendua sebagai pakej npm untuk memudahkan penggunaan semula kod dan menggunakan apa yang saya. dipelajari sambil memberi kembali kepada masyarakat.

Baca artikel ini, anda akan mendapat:

  • Seluruh proses mencipta dan menerbitkan npm dari awal. [Cadangan tutorial berkaitan: tutorial video nodejs, Pengajaran pengaturcaraan]

  • Perpustakaan alat penyahduplikasi permintaan aksios yang berterusan dan mudah serta praktikal.

Persediaan perpustakaan alat

Buat projek baharu, termasuk package.json

{
    "name": "drrq",
    "type": "module",
    "version": "1.0.0"
}
Salin selepas log masuk

Pelaksanaan fungsi/src/index.js

npm i qs axios

Idea utama ialah menggunakan url dan parameter yang diminta sebagai kunci untuk merekod baris gilir permintaan Apabila permintaan berulang berlaku, ganggu permintaan seterusnya dan kongsi hasil permintaan sebelumnya yang seterusnya apabila ia dikembalikan.

import qs from "qs";
import axios from "axios";

let pending = []; //用于存储每个ajax请求的取消函数和ajax标识
let task = {}; //用于存储每个ajax请求的处理函数,通过请求结果调用,以ajax标识为key

//请求开始前推入pending
const 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);
};

// 创建task
const createTask = (key, resolve) => {
    let callback = (response) => {
        resolve(response.data);
    };
    if (!task[key]) task[key] = [];
    task[key].push(callback);
};
// 处理task
const handleTask = (key, response) => {
    for (let i = 0; task[key] && i < task[key].length; i++) {
        task[key][i](response);
    }
    task[key] = undefined;
};

const getHeaders = { &#39;Content-Type&#39;: &#39;application/json&#39; };
const postHeaders = { &#39;Content-Type&#39;: &#39;application/x-www-form-urlencoded&#39; };
const fileHeaders = { &#39;Content-Type&#39;: &#39;multipart/form-data&#39; };

const request = (method, url, params, headers, preventRepeat = true, uploadFile = false) => {
    let key = url + &#39;?&#39; + 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 === &#39;post&#39; || method === &#39;put&#39; ? { data: !uploadFile ? qs.stringify(params) : params } : { params }))
            .then((response) => {
                // 处理task
                handleTask(key, response);
            })
            .catch(() => {});
    });
};

export const get = (url, data = {}, preventRepeat = true) => {
    return request(&#39;get&#39;, url, data, getHeaders, preventRepeat, false);
};
 export const post = (url, data = {}, preventRepeat = true) => {
     return request(&#39;post&#39;, url, data, postHeaders, preventRepeat, false);
 };
 export const file = (url, data = {}, preventRepeat = true) => {
     return request(&#39;post&#39;, url, data, fileHeaders, preventRepeat, true);
 };
export default { request, get, post, file };
Salin selepas log masuk

Tambah contoh folder/contoh kod

Contoh entri index.js

import { exampleRequestGet } from &#39;./api.js&#39;;
const example = async () => {
    let res = await exampleRequestGet();
    console.log(&#39;请求成功 &#39;);
};
example();
Salin selepas log masuk

api list api.js

import { request } from &#39;./request.js&#39;;
// 示例请求Get
export const exampleRequestGet = (data) => request(&#39;get&#39;, &#39;/xxxx&#39;, data);

// 示例请求Post
export const exampleRequestPost = (data) => request(&#39;post&#39;, &#39;/xxxx&#39;, data);

// 示例请求Post 不去重
export const exampleRequestPost2 = (data) => request(&#39;post&#39;, &#39;/xxxx&#39;, data, false);

// 示例请求Post 不去重
export const exampleRequestFile = (data) => request(&#39;file&#39;, &#39;/xxxx&#39;, data, false);
Salin selepas log masuk

Global request package request.js

import drrq from &#39;../src/index.js&#39;;
const baseURL = &#39;https://xxx&#39;;

// 处理请求数据  (拼接url,data添加token等) 请根据实际情况调整
const paramsHandler = (url, data) => {
    url = baseURL + url;
    data.token = &#39;xxxx&#39;;
    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 == &#39;get&#39; || method == &#39;GET&#39; || method == &#39;Get&#39;) {
        res = await drrq.get(url, data, preventRepeat);
    }
    if (method == &#39;post&#39; || method == &#39;POST&#39; || method == &#39;Post&#39;) {
        res = await drrq.post(url, data, preventRepeat);
    }
    if (method == &#39;file&#39; || method == &#39;FILE&#39; || method == &#39;file&#39;) {
        res = await drrq.file(url, data, preventRepeat);
    }
    return resHandler(res);
};
Salin selepas log masuk

Fungsi ujian

Selepas kod ditulis, kita perlu mengesahkan sama ada fungsi itu normal, package.json plus

    "scripts": {
        "test": "node example"
    },
Salin selepas log masuk

Melaksanakan ujian larian npm

Membawa anda langkah demi langkah untuk mencipta dan menerbitkan pakej npm dari awal

berfungsi seperti biasa dan pustaka alat sudah sedia.

(pembaca eslin dan lebih cantik boleh memilih mengikut situasi)

Pembungkusan

Pembungkusan projek am menggunakan webpack, manakala pembungkusan perpustakaan alat menggunakan rollup

Pasang Rollup

Pasang Rollup dengan arahan berikut:

npm install --save-dev rollup
Salin selepas log masuk

Buat fail konfigurasi

Buat satu dalam direktori akar Rollup.config.js fail baharu

export default {
  input: "src/index.js",
  output: {
    file: "dist/drrp.js",
    format: "esm",
    name: &#39;drrp&#39;
  }
};
Salin selepas log masuk
  • input - fail yang akan dibungkus
  • output.file - fail output (jika tiada parameter ini, ia akan menjadi output terus ke Console)
  • output.format - Jenis fail output rollup

Pasang babel

Jika anda ingin menggunakan sintaks es6 untuk pembangunan, anda juga perlu gunakan babel. Kod ini disusun menjadi es5. Oleh kerana mekanisme modul pelancaran ialah Modul ES6, sintaks es6 lain tidak akan disusun.

Modul pemasangan

rollup-plugin-babel menggabungkan rollup dan babel dengan sempurna.

npm install --save-dev rollup-plugin-babel@latest
npm install --save-dev @babel/core 
npm install --save-dev @babel/preset-env
Salin selepas log masuk

Buat .babelrc dalam direktori akar

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

Serasi dengan commonjs

gulungan menyediakan pemalam gulungan -plugin-commonjs untuk memudahkan rujukan pakej standard commonjs dalam rollup. Fungsi pemalam ini adalah untuk menukar modul commonjs kepada modul es6.

rollup-plugin-commonjs biasanya digunakan bersama dengan rollup-plugin-node-resolve, yang digunakan untuk menyelesaikan laluan modul bergantung.

Pasang modul

npm install --save-dev rollup-plugin-commonjs rollup-plugin-node-resolve
Salin selepas log masuk

Compress bundle

Tambah UglifyJS, yang boleh dioptimumkan dengan mengalih keluar ulasan, memendekkan nama pembolehubah dan menyusun semula kod . Mengurangkan saiz berkas ke tahap yang besar - Ini mengurangkan kebolehbacaan kod ke tahap tertentu, tetapi menjadikan komunikasi rangkaian lebih cekap.

Pasang pemalam

Gunakan arahan berikut untuk memasang rollup-plugin-uglify:

npm install --save-dev rollup-plugin-uglify
Salin selepas log masuk

完整配置

rollup.config.js 最终配置如下

import resolve from &#39;rollup-plugin-node-resolve&#39;;
import commonjs from &#39;rollup-plugin-commonjs&#39;;
import babel from &#39;rollup-plugin-babel&#39;;
import { uglify } from &#39;rollup-plugin-uglify&#39;;
import json from &#39;@rollup/plugin-json&#39;

const paths = {
    input: {
        root:  &#39;src/index.js&#39;,
    },
    output: {
        root:  &#39;dist/&#39;,
    },
};

const fileName = `drrq.js`;

export default {
    input: `${paths.input.root}`,
    output: {
        file: `${paths.output.root}${fileName}`,
        format: &#39;esm&#39;,
        name: &#39;drrq&#39;,
    },
    plugins: [
        json(),
        resolve(),
        commonjs(),
        babel({
            exclude: &#39;node_modules/**&#39;,
            runtimeHelpers: true,
        }),
        uglify(),
    ],
};
Salin selepas log masuk

在package.json中加上

"scripts": {
    "build": "rollup -c"
},
Salin selepas log masuk

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

发包前的准备

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

Membawa anda langkah demi langkah untuk mencipta dan menerbitkan pakej npm dari awal

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

Membawa anda langkah demi langkah untuk mencipta dan menerbitkan pakej npm dari awal

修改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": {
       ...
    }
}
Salin selepas log masuk
  • 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就搞定啦

Membawa anda langkah demi langkah untuk mencipta dan menerbitkan pakej npm dari awal

Membawa anda langkah demi langkah untuk mencipta dan menerbitkan pakej npm dari awal

本文的完整代码已开源至gitee.com/yuanying-11… ,感兴趣的读者欢迎fork和star!

转载地址:https://juejin.cn/post/7172240485778456606

更多node相关知识,请访问:nodejs 教程

Atas ialah kandungan terperinci Membawa anda langkah demi langkah untuk mencipta dan menerbitkan pakej npm dari awal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah yang perlu saya lakukan jika saya mendapat ralat semasa memasang npm react? Apakah yang perlu saya lakukan jika saya mendapat ralat semasa memasang npm react? Dec 27, 2022 am 11:25 AM

Penyelesaian kepada ralat pemasangan npm react: 1. Buka fail "package.json" dalam projek dan cari objek dependencies 2. Alihkan "react.json" ke "devDependencies" 3. Jalankan "audit npm dalam terminal -- pengeluaran" untuk menetapkan amaran.

Bagaimana untuk memadam nod dalam nvm Bagaimana untuk memadam nod dalam nvm Dec 29, 2022 am 10:07 AM

Cara memadam nod dengan nvm: 1. Muat turun "nvm-setup.zip" dan pasangkannya pada pemacu C 2. Konfigurasikan pembolehubah persekitaran dan semak nombor versi melalui arahan "nvm -v" 3. Gunakan "nvm arahan install" Pasang nod; 4. Padamkan nod yang dipasang melalui arahan "nvm uninstall".

Cara menggunakan ekspres untuk mengendalikan muat naik fail dalam projek nod Cara menggunakan ekspres untuk mengendalikan muat naik fail dalam projek nod Mar 28, 2023 pm 07:28 PM

Bagaimana untuk mengendalikan muat naik fail? Artikel berikut akan memperkenalkan kepada anda cara menggunakan ekspres untuk mengendalikan muat naik fail dalam projek nod saya harap ia akan membantu anda!

Analisis mendalam tentang alat pengurusan proses Node 'pm2' Analisis mendalam tentang alat pengurusan proses Node 'pm2' Apr 03, 2023 pm 06:02 PM

Artikel ini akan berkongsi dengan anda alat pengurusan proses Node "pm2", dan bercakap tentang mengapa pm2 diperlukan, cara memasang dan menggunakan pm2, saya harap ia akan membantu semua orang!

PI Node Teaching: Apakah nod pi? Bagaimana cara memasang dan menyediakan nod pi? PI Node Teaching: Apakah nod pi? Bagaimana cara memasang dan menyediakan nod pi? Mar 05, 2025 pm 05:57 PM

Penjelasan dan Panduan Pemasangan Terperinci untuk Pinetwork Nodes Artikel ini akan memperkenalkan ekosistem pinetwork secara terperinci - nod pi, peranan utama dalam ekosistem pinetwork, dan menyediakan langkah -langkah lengkap untuk pemasangan dan konfigurasi. Selepas pelancaran Rangkaian Ujian Blockchain Pinetwork, nod PI telah menjadi bahagian penting dari banyak perintis yang aktif mengambil bahagian dalam ujian, bersiap sedia untuk pelepasan rangkaian utama yang akan datang. Jika anda tidak tahu kerja pinet, sila rujuk apa itu picoin? Berapakah harga untuk penyenaraian? Penggunaan PI, perlombongan dan analisis keselamatan. Apa itu Pinetwork? Projek Pinetwork bermula pada tahun 2019 dan memiliki syiling pi cryptocurrency eksklusifnya. Projek ini bertujuan untuk mewujudkan satu yang semua orang boleh mengambil bahagian

Apa yang perlu dilakukan jika npm nod gyp gagal Apa yang perlu dilakukan jika npm nod gyp gagal Dec 29, 2022 pm 02:42 PM

npm node gyp gagal kerana versi "node-gyp.js" dan "Node.js" tidak sepadan Penyelesaiannya: 1. Kosongkan cache nod melalui "npm cache clean -f" 2. Melalui "npm install -. g n" Pasang modul n; 3. Pasang versi "nod v12.21.0" melalui arahan "n v12.21.0".

Mari kita bincangkan tentang cara menggunakan pkg untuk membungkus projek Node.js ke dalam fail boleh laku. Mari kita bincangkan tentang cara menggunakan pkg untuk membungkus projek Node.js ke dalam fail boleh laku. Dec 02, 2022 pm 09:06 PM

Bagaimana untuk membungkus fail boleh laku nodejs dengan pkg? Artikel berikut akan memperkenalkan kepada anda cara menggunakan pkg untuk membungkus projek Node ke dalam fail boleh laku. Saya harap ia akan membantu anda!

Apakah yang perlu saya lakukan jika nod tidak boleh menggunakan arahan npm? Apakah yang perlu saya lakukan jika nod tidak boleh menggunakan arahan npm? Feb 08, 2023 am 10:09 AM

Sebab mengapa nod tidak boleh menggunakan arahan npm adalah kerana pembolehubah persekitaran tidak dikonfigurasikan dengan betul Penyelesaiannya ialah: 1. Buka "Sistem Sifat"; 2. Cari "Pembolehubah Persekitaran" -> "Pembolehubah Sistem", dan kemudian edit persekitaran. pembolehubah; 3. Cari lokasi folder nodejs;

See all articles