vite2的庫項(xiàng)目,打包發(fā)布到npmjs.com的方法

官網(wǎng)資料

構(gòu)建生產(chǎn)版本——庫模式
https://cn.vitejs.dev/guide/build.html#library-mode

詳細(xì)設(shè)置
https://cn.vitejs.dev/config/#build-lib

用 rollup 打包發(fā)布

以前只會(huì)用 webpack 的方式打包拼岳,用 vue-cli 建立項(xiàng)目枝誊,然后打包。這樣打的包比較大惜纸,里面“無用”的內(nèi)容比較多,我喜歡清爽型的绝骚,聽說 rollup 打包的內(nèi)容會(huì)少很多耐版,而且項(xiàng)目也都改用 vite 來創(chuàng)建,用 rollup 打包可以更方便一些压汪。

寫代碼

先寫一個(gè)簡單的功能做測(cè)試粪牲。
做一個(gè)獲取類型、判斷類型的小工具 http://www.reibang.com/p/422805e6f793 止剖。
這個(gè)代碼比較簡單腺阳,一個(gè)js文件即可落君,正好用來做測(cè)試。
建立一個(gè)新的 vite 項(xiàng)目亭引,建立 lib 文件夾绎速,里面設(shè)置一個(gè) main.js 文件

lib/main.js

    /**
   * 用 call 的方式獲取類型
   * @param {*} val 要驗(yàn)證的實(shí)例
   * @returns
   * *   '[object Object]',
   * *   '[object Array]',
   * *   '[object Map]',
   * *   '[object Set]',
   * *   '[object Function]',
   * *   '[object AsyncFunction]',
   * *   '[object Promise]',
   * *   '[object Symbol]',
   * *   '[object String]',
   * *   '[object Number]',
   * *   '[object BigInt]',
   * *   '[object RegExp]',
   * *   '[object Date]',
   * *   '[object Math]',
   * *   '[object Null]',
   * *   '[object Undefined]'
   * *   其他
   */
  const toTypeString = (val) => { 
    return Object.prototype.toString.call(val)
  }
  
  /**
   * 獲取具體類型
   * @param {*} val 要驗(yàn)證的實(shí)例
   * @returns 
   * *   'function',
   * *   'async',
   * *   'object',
   * *   'array',
   * *   'string',
   * *   'number',
   * *   'bigInt',
   * *   'regExp',
   * *   'date',
   * *   'map',
   * *   'set',
   * *   'promise',
   * *   'symbol',
   * *   'math',
   * *   'null',
   * *   'undefined'
   * *   其他
   */
  const typeName = (val) => {
    return Object.prototype.toString.call(val).replace(/^\[object (\S+)\]$/,'$1').toLowerCase()
  }

  const hasOwnProperty = Object.prototype.hasOwnProperty
  const hasOwn = (val, key) => hasOwnProperty.call(val, key)

  /**
   *  驗(yàn)證普通函數(shù)
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
  const isFunction = (val) => toTypeString(val) === '[object Function]'

  /**
   * 驗(yàn)證 async 的函數(shù)
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
  const isAsync = (val) => toTypeString(val) === '[object asyncFunction]'
 
  /**
   * 驗(yàn)證 Object,不含 null
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
  const isObject = (val) => val !== null && typeof val === 'object'
 
  /**
   *  驗(yàn)證數(shù)組
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
   const isArray = Array.isArray
 
   /**
   * 驗(yàn)證字符串
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
  const isString = (val) => typeof val === 'string'
 
  /**
   * 驗(yàn)證 number
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
 
  const isNumber = (val) => typeof val === 'number'
 
  /**
   * 驗(yàn)證 BigInt
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
  const isBigInt = (val) => typeof val === 'bigint'
 
  /**
   * 驗(yàn)證 boolean
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
   const isBoolean = (val) => typeof val === 'boolean'
 
   /**
   * 驗(yàn)證正則類型
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
  const isRegExp = (val) => toTypeString(val) === '[object RegExp]'
  /**
   * 驗(yàn)證日期
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
  const isDate = (val) => val instanceof Date

  /**
   * 驗(yàn)證 map
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
  const isMap = (val) => toTypeString(val) === '[object Map]'
  /**
   * 驗(yàn)證 set
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
  const isSet = (val) => toTypeString(val) === '[object Set]'
  /**
   *  驗(yàn)證 Promise
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
  const isPromise = (val) => toTypeString(val) === '[object Promise]'
  /**
   * 驗(yàn)證 Symbol
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
  const isSymbol = (val) => typeof val === 'symbol'

  /**
   * null 或者 undefined 返回 true
   * @param {*} val 要驗(yàn)證的對(duì)象
   * @returns 
   */
  const isNullOrUndefined = (val) => {
    if (val === null) return true
    if (typeof val === 'undefined') return true
    return false
  }
 

export {
  toTypeString, // Object.prototype.toString.call(val)
  typeName, // 獲取可以識(shí)別的名稱

  hasOwnProperty,
  hasOwn,

  isFunction, // 驗(yàn)證普通函數(shù)
  isAsync, // 驗(yàn)證 async 的函數(shù)
  isObject, // 驗(yàn)證 Object
  isArray, // 驗(yàn)證數(shù)組
  isString, // 驗(yàn)證字符串
  isNumber, // 驗(yàn)證 number
  isBigInt, // 驗(yàn)證 BigInt
  isBoolean, // 驗(yàn)證 布爾
  isRegExp, // 驗(yàn)證正則類型
  isDate, // 驗(yàn)證日期
  isMap, // 驗(yàn)證 map
  isSet, // 驗(yàn)證 set
  isPromise, // 驗(yàn)證 Promise
  isSymbol, // 驗(yàn)證 Symbol
 
  isNullOrUndefined // null 或者 undefined 返回 true
}
  • 文件名
    文件名應(yīng)該可以隨意寫焙蚓,只要在 vite.config.js 里面設(shè)置好即可纹冤,main.js 是參考官網(wǎng)設(shè)置的。

  • jsDoc
    jsDoc 可以在引用的地方出現(xiàn)提示购公,只是打包之后就沒有了萌京,也許必須用TS才能帶上提示嗎?

代碼寫好之后宏浩,我們開始做各種設(shè)置知残。

vite.config.js的設(shè)置

按照官網(wǎng)做設(shè)置,這里的寫法和官網(wǎng)有點(diǎn)區(qū)別比庄,但是測(cè)試可用求妹。

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path' // 主要用于alias文件路徑別名

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  // 打包配置
  build: {
    lib: {
      entry: resolve(__dirname, 'lib/main.js'),
      name: 'rollup-plugin-nf-typeof',
      fileName: (format) => `rollup-plugin-nf-typeof.${format}.js`
    },
    sourcemap: true,
    rollupOptions: {
      // 確保外部化處理那些你不想打包進(jìn)庫的依賴
      external: ['vue'],
      output: {
        // 在 UMD 構(gòu)建模式下為這些外部化的依賴提供一個(gè)全局變量
        globals: {
          vue: 'Vue'
        }
      }
    }
  }
})

vite 會(huì)按照這里的設(shè)置進(jìn)行打包,打包分為兩種模式印蔗,一個(gè)是umd 的形式扒最,另一個(gè)就是es的模式,這個(gè)打包后和我們寫的代碼基本沒啥區(qū)別华嘹。

  • entry
    指定要打包的入口文件吧趣。

  • name
    包的名稱

  • fileName
    包文件的名稱,默認(rèn)是umd和es兩個(gè)文件耙厚。

  • sourcemap
    是否生成 .map 文件强挫,默認(rèn)是不會(huì)生成的,如果需要的話需要設(shè)置為 true薛躬。

  • rollupOptions
    如果項(xiàng)目引用了第三方插件俯渤,那么需要在這里設(shè)置排除,如果不設(shè)置的話型宝,第三方插件的源碼也會(huì)被打包進(jìn)來八匠,這樣打包文件就變大了。排除之后第三方的插件會(huì)單獨(dú)存在趴酣。

package.json 的設(shè)置

這里是在 npmjs.com上面發(fā)布的時(shí)候需要的設(shè)置梨树,這里的設(shè)置要和vite.config.js的設(shè)置相對(duì)應(yīng)。

{
  "name": "rollup-plugin-nf-typeof",
  "version": "0.0.4",
  "description": "驗(yàn)證JavaScript的數(shù)據(jù)類型岖寞。",
  "files": ["dist"],
  "main": "./dist/rollup-plugin-nf-typeof.umd.js",
  "module": "./dist/rollup-plugin-nf-typeof.es.js",
  "exports": {
    ".": {
      "import": "./dist/rollup-plugin-nf-typeof.es.js",
      "require": "./dist/rollup-plugin-nf-typeof.umd.js"
    }
  },
  "private": false,
  "license": "MIT",
  "auther": "jin yang (jyk) jyk0013@163.com",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "serve": "vite preview"
  }
}
  • name: 資源包的名稱抡四。
  • version:版本號(hào),每次發(fā)布都要更新一下版本號(hào)。
  • files: 打包后的文件夾名稱指巡。
  • 設(shè)置資源包的名稱:設(shè)置好就對(duì)了淑履,如果寫錯(cuò)了就會(huì)找不到文件。

發(fā)布

在npmjs.com上面發(fā)布的方式是一樣的藻雪。注冊(cè)秘噪、登錄、發(fā)布即可阔涉。
整理一下在 npmjs.com 上面發(fā)布資源包踩過的坑:http://www.reibang.com/p/3de34c804f64

安裝使用

這個(gè)包只是普通的 webpack 的包缆娃,所以正常安裝即可:

npm i rollup-plugin-nf-typeof
或者
yarn add rollup-plugin-nf-typeof

組件里面使用:

import { isArray } from 'rollup-plugin-nf-typeof'

    const arr = []
    console.log(isArray(arr))

使用效果

沒有使用map的效果:

無map

使用mao的效果:

有map

使用map之后,就和我們寫的代碼一模一樣了瑰排,這樣調(diào)試起來就更方便贯要。

注意

這個(gè)并不是vite的插件,所以使用的時(shí)候不需要在vite.config.js里面做設(shè)置椭住。
如果是vite的插件崇渗,才需要做設(shè)置。

那么vite的插件如何編寫呢京郑?還沒有完全弄明白宅广。。些举。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跟狱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子户魏,更是在濱河造成了極大的恐慌驶臊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叼丑,死亡現(xiàn)場(chǎng)離奇詭異关翎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鸠信,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門纵寝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人星立,你說我怎么就攤上這事爽茴。” “怎么了绰垂?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵闹啦,是天一觀的道長。 經(jīng)常有香客問我辕坝,道長,這世上最難降的妖魔是什么荐健? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任酱畅,我火速辦了婚禮琳袄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纺酸。我一直安慰自己窖逗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布餐蔬。 她就那樣靜靜地躺著碎紊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪樊诺。 梳的紋絲不亂的頭發(fā)上仗考,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音词爬,去河邊找鬼秃嗜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛顿膨,可吹牛的內(nèi)容都是我干的锅锨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼恋沃,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼必搞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起囊咏,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤恕洲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后匆笤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體研侣,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年炮捧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庶诡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咆课,死狀恐怖末誓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情书蚪,我是刑警寧澤喇澡,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站殊校,受9級(jí)特大地震影響晴玖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一呕屎、第九天 我趴在偏房一處隱蔽的房頂上張望让簿。 院中可真熱鬧,春花似錦秀睛、人聲如沸尔当。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椭迎。三九已至,卻和暖如春田盈,著一層夾襖步出監(jiān)牢的瞬間畜号,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工缠黍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弄兜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓瓷式,卻偏偏與公主長得像替饿,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贸典,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容