vite2 做的UI庫展运,打包發(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

發(fā)布一個(gè)組件

上次(http://www.reibang.com/p/1bf2915aa970)說的是如何發(fā)布一個(gè)純 JavaScript 的函數(shù)庫咙边,那么組件怎么發(fā)布呢审编?
雖然帶了HTML撼班,但是原理是一樣的。做一個(gè)入口文件垒酬,import 組件即可砰嘁。
vite會(huì)自動(dòng)把模板變成 jsx 的形式件炉。

寫代碼

我們基于 element-plus 做一個(gè)二次封裝,先做個(gè)最簡(jiǎn)單的文本框矮湘。

// ./form/item/t-text.vue

<!--單行文本-->
<template>
  <el-input
    v-model="value"
    :id="'c' + columnId"
    :name="'c' + columnId"
    :size="size"
    :clearable="clearable"
    :validate-event="validate_event"
    :show-word-limit="show_word_limit"
    @blur="run"
    @change="run"
    @clear="run"
    @input="myinput"
    @keydown="clear"
  >
  </el-input>
</template>

<script >
  import { defineComponent } from 'vue'
  // 引入組件需要的屬性 引入表單子控件的管理類
  import { itemProps, itemController } from 'nf-ui-controller'

  export default defineComponent({
    name: 'el-form-item-text',
    props: {
      modelValue: [String, Number],
      ...itemProps // 基礎(chǔ)屬性
    },
    emits: ['update:modelValue'],
    setup (props, context) {
      const {
        value,
        run,
        clear,
        myinput
      } = itemController(props, context.emit)

      return {
        value,
        run,
        clear,
        myinput
      }
    }
  })
</script>

然后在入口文件里面引入組件

import nfText from './form/item/t-text.vue'

export {
  nfText
}

然后按照上一次介紹的方法打包發(fā)布即可斟冕。

打包后的代碼:

var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
import { defineComponent, resolveComponent, openBlock, createBlock } from "vue";
import { itemProps, itemController } from "nf-ui-controller";
var _export_sfc = (sfc, props) => {
  for (const [key, val] of props) {
    sfc[key] = val;
  }
  return sfc;
};
const _sfc_main = defineComponent({
  name: "el-form-item-text",
  props: __spreadValues({
    modelValue: [String, Number]
  }, itemProps),
  emits: ["update:modelValue"],
  setup(props, context) {
    const {
      value,
      run,
      clear,
      myinput
    } = itemController(props, context.emit);
    return {
      value,
      run,
      clear,
      myinput
    };
  }
});
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
  const _component_el_input = resolveComponent("el-input");
  return openBlock(), createBlock(_component_el_input, {
    modelValue: _ctx.value,
    "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.value = $event),
    id: "c" + _ctx.columnId,
    name: "c" + _ctx.columnId,
    size: _ctx.size,
    clearable: _ctx.clearable,
    "validate-event": _ctx.validate_event,
    "show-word-limit": _ctx.show_word_limit,
    onBlur: _ctx.run,
    onChange: _ctx.run,
    onClear: _ctx.run,
    onInput: _ctx.myinput,
    onKeydown: _ctx.clear
  }, null, 8, ["modelValue", "id", "name", "size", "clearable", "validate-event", "show-word-limit", "onBlur", "onChange", "onClear", "onInput", "onKeydown"]);
}
var tText = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
export { tText as nfText };
//# sourceMappingURL=nf-ui-element-plus.es.js.map

還是比較清爽的。

依賴庫的處理方式

這個(gè)實(shí)例里依賴的第三方庫有三個(gè):vue缅阳、element-plus磕蛇,以及自己封裝的nf-ui-controller。
打包的時(shí)候十办,可以通過vite.config.js來設(shè)置秀撇。

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: 'nf-ui-element-plus',
      fileName: (format) => `nf-ui-element-plus.${format}.js`
    },
    sourcemap: true,
    rollupOptions: {
      // 確保外部化處理那些你不想打包進(jìn)庫的依賴
      external: ['vue','nf-ui-controller','element-plus'],
      output: {
        // 在 UMD 構(gòu)建模式下為這些外部化的依賴提供一個(gè)全局變量
        globals: {
          vue: 'Vue',
          'nf-ui-controller': 'nfUIController',
          'element-plus': 'elementPlus'
        }
      }
    }
  }
})

注意看 external 的部分,這樣打包后向族,依賴的第三方庫會(huì)以 import 的方式(詳見上面的代碼)出現(xiàn)呵燕,否則會(huì)把源碼打到包里面,這樣文件就變大了件相。

安裝的時(shí)候會(huì)安裝哪些內(nèi)容再扭?

這個(gè)就要看 package.json 的設(shè)置情況了。

{
  "name": "nf-ui-element-plus",
  "version": "0.0.2",
  "description": "基于 element-plus 的二次封裝夜矗。",
  "keyword": "vue3 element-plus",
  "files": [
    "dist"
  ],
  "main": "./dist/nf-ui-element-plus.umd.js",
  "module": "./dist/nf-ui-element-plus.es.js",
  "exports": {
    ".": {
      "import": "./dist/nf-ui-element-plus.es.js",
      "require": "./dist/nf-ui-element-plus.umd.js"
    }
  },
  "private": false,
  "license": "MIT",
  "auther": "jin yang (jyk). Email: jyk0013@163.com",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "serve": "vite preview"
  },
  "dependencies": {
    "element-plus": "^1.2.0-beta.3",
    "nf-ui-controller": "^0.0.1",
    "vue": "^3.2.16"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^1.9.3",
    "vite": "^2.6.4"
  }
}

如果這樣寫的話泛范,安裝后,就會(huì)把依賴庫也給安裝上去紊撕,這樣項(xiàng)目文件就比較大了敦跌。

那么能不能清爽一點(diǎn)呢?當(dāng)然可以逛揩,我們只需要在發(fā)布的時(shí)候去掉 dependencies柠傍、devDependencies 即可。

{
  "name": "nf-ui-element-plus",
  "version": "0.0.2",
  "description": "基于 element-plus 的二次封裝辩稽。",
  "keyword": "vue3 element-plus",
  "files": [
    "dist"
  ],
  "main": "./dist/nf-ui-element-plus.umd.js",
  "module": "./dist/nf-ui-element-plus.es.js",
  "exports": {
    ".": {
      "import": "./dist/nf-ui-element-plus.es.js",
      "require": "./dist/nf-ui-element-plus.umd.js"
    }
  },
  "private": false,
  "license": "MIT",
  "auther": "jin yang (jyk). Email: jyk0013@163.com",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "serve": "vite preview"
  }
}

這樣設(shè)置后惧笛,在發(fā)布包。然后在項(xiàng)目里安裝的時(shí)候逞泄,就只會(huì)安裝我們自己的文件患整,不會(huì)安裝第三方插件的代碼了。

當(dāng)然這樣設(shè)置也有個(gè)麻煩喷众,需要項(xiàng)目自己安裝第三方插件各谚。

方法就是這樣,大家可以自行取舍

使用方式

局部注冊(cè)

上面的方式只支持局部注冊(cè)的方式到千。

<template>
  <div class="" style="text-align: left;">
    <nf-text></nf-text>
  </div>
</template>

<script>
// @ is an alias to /src
import { reactive } from 'vue'
import { nfText } from 'nf-ui-element-plus'

export default {
  name: 'Home',
  components: {
    nfText
  },
  setup () { 
    return {
    }
  }
}
</script>

這樣就可以使用了昌渤。

全局注冊(cè)的方法

如果想要實(shí)現(xiàn)全局注冊(cè)的話,就需要寫一個(gè)插件來實(shí)現(xiàn)憔四,這個(gè)膀息,下次再說般眉。

源碼

https://gitee.com/naturefw/nf-rollup-ui-element-plus

還在開發(fā)中。潜支。甸赃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冗酿,隨后出現(xiàn)的幾起案子埠对,更是在濱河造成了極大的恐慌,老刑警劉巖裁替,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸠窗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡胯究,警方通過查閱死者的電腦和手機(jī)稍计,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裕循,“玉大人臣嚣,你說我怎么就攤上這事“疲” “怎么了硅则?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)株婴。 經(jīng)常有香客問我怎虫,道長(zhǎng),這世上最難降的妖魔是什么困介? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任大审,我火速辦了婚禮,結(jié)果婚禮上座哩,老公的妹妹穿的比我還像新娘徒扶。我一直安慰自己,他們只是感情好根穷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布姜骡。 她就那樣靜靜地躺著,像睡著了一般屿良。 火紅的嫁衣襯著肌膚如雪圈澈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天尘惧,我揣著相機(jī)與錄音康栈,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谅将,可吹牛的內(nèi)容都是我干的漾狼。 我是一名探鬼主播重慢,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼饥臂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了似踱?” 一聲冷哼從身側(cè)響起隅熙,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎核芽,沒想到半個(gè)月后囚戚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轧简,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年驰坊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哮独。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拳芙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出皮璧,到底是詐尸還是另有隱情舟扎,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布悴务,位于F島的核電站睹限,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏讯檐。R本人自食惡果不足惜羡疗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望别洪。 院中可真熱鬧顺囊,春花似錦、人聲如沸蕉拢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晕换。三九已至午乓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闸准,已是汗流浹背益愈。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒸其。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓敏释,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親摸袁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钥顽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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