輕輕松松開發(fā)一個VUE插件并發(fā)布到npm

一直想了解如何發(fā)布一個npm包辽幌,然后也很想學(xué)習(xí)怎么開發(fā)一個vue插件耕捞,但是一直沒有動手去做缎脾,最近對自己有點失望鞋喇,??卯足了勁終于動手做了一個還比較滿意的插件记焊。

在開發(fā)這個插件的時候虏杰,項目搭建是自己從頭開始寫的腥刹,所以記錄了一下脑溢,可以參考從零搭建一個vue項目

初始化項目

創(chuàng)建文件夾并初始化:

mkdir vue-fun-loading && cd vue-fun-loading
npm init

編寫插件邏輯

安裝vue及相關(guān)插件:

npm i -D vue vue-loader css-loader

創(chuàng)建插件的核心邏輯文件夾lib喻奥,以及寫插件邏輯的文件:

mkdir lib && cd lib
touch Loading.vue

這里用一個loading的組件作為示例來說明席纽,核心代碼如下??:

<!--/lib/Loading.vue-->
<template>
    <div :class="`fun-loading-circle-half fun-loading-circle-half-${size}`"></div>
</template>
<script>
    export default {
        name: 'FunLoadingCircleHalf',
        props: {
            size: {
                type: String,
                default: 'middle',
                elem: ['small', 'middle', 'large']
            }
        }
    }
</script>
<style>
    .fun-loading-circle-half {
        border-radius: 50%;
        border-color: #ff69b4 #ff69b4 transparent transparent;
        border-style: solid;
        animation: load_half_rorate .6s infinite;
    }

    .fun-loading-circle-half-small {
        width: 14px;
        height: 14px;
        border-width: 3px;
    }
    .fun-loading-circle-half-middle {
        width: 28px;
        height: 28px;
        border-width: 4px;
    }
    .fun-loading-circle-half-large {
        width: 40px;
        height: 40px;
        border-width: 5px;
    }

    @keyframes load_half_rorate {
        100% {
            transform: rotate(360deg);
        }
    }
</style>

上面的代碼比較簡單,用css實現(xiàn)了一個半圓旋轉(zhuǎn)的loading效果撞蚕。

然后lib文件夾下創(chuàng)建一個index.js文件润梯,在這個文件中,通過訪問window.vue使用Vue.component方法注冊封裝的Loading??:

// /lib/index.js
import Loading from './Loading';

const install = function (Vue, opts = {}) {
    if (install.installed) return;

    Vue.component(Loading.name, Loading);
};

if (typeof window !== 'undefined' && window.Vue) {
    install(window.Vue);
}

export default install;

到這里插件的核心邏輯就完成了,接下來的打包配置方面纺铭。

webpack配置

安裝webpack寇钉,創(chuàng)建webpack.config.js:

npm i -D webpack webpack-cli cross-env
touch webpack.config.js

通過配置webpack,對項目進(jìn)行打包舶赔,配置如下??:

const path = require('path');

const config = {
    mode: 'production',
    entry: './lib/index.js',
    output: {
        filename: 'vue-fun-loading.js',
        path: path.resolve(__dirname, './dist/'),
        library: 'VueFunLoading',
        libraryTarget: 'umd',
        umdNamedDefine: true
    },
    module: {
        rules: [
            {
                test: /\.vue$/,
                loader: 'vue-loader'
            },
            {
                test: /\.css$/,
                loader: 'css-loader'
            }
        ]
    },
    resolve: {
        extensions: ['*', '.js', '.vue', '.json'],
        alias: {
            'vue$': 'vue/dist/vue.esm.js'
        }
    },
    externals: {
        'vue': 'vue'
    },
    devtool: '#eval-source-map'
};


module.exports = config;

其中l(wèi)oader的配置就不多說了扫倡,對于發(fā)布一個npm包最核心的配置就是output中的配置,這里說明一下:

  • libary:庫的名稱竟纳,取決于output.libraryTarget 選項的值
  • libaryTarget:配置如何暴露libary撵溃,值可以是:var(暴露為一個變量)、umd(暴露為所有的模塊定義下都可運(yùn)行的方式)锥累、amd(暴露為 AMD 模塊)征懈、commonjs2(入口起點的返回值將分配給 module.exports 對象)或者通過在對象上賦值暴露等
  • umdNamedDefine:會對 UMD 的構(gòu)建過程中的 AMD 模塊進(jìn)行命名,否則使用匿名的define

關(guān)于更多的webpack創(chuàng)建libary的信息可以查看:創(chuàng)建 library

然后在package.json中配置腳本:

"scripts": {
    "build": "cross-env NODE_ENV=production webpack --config ./build/webpack.config.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

運(yùn)行npm run build可以看到生成了dist文件以及vue-fun-loading.js揩悄,表示打包運(yùn)行成功??卖哎。

npm發(fā)布與配置

首先在package.json中添加配置:

// 公開
"private": false,
// 指定了加載的入口文件。默認(rèn)值是模塊根目錄下面的index.js
"main": "dist/vue-fun-loading.js",
// 數(shù)組删性,內(nèi)容是模塊下文件名或者文件夾名亏娜,如果是文件夾名,則文件夾下所有的文件也會被包含進(jìn)來
"files": [
    "dist",
    "lib"
],
"keywords": [
    "loading",
    "vue"
],
// 如果有g(shù)it項目蹬挺,則可以配置git項目的地址
"repository": {
    "type": "git",
    "url": "https://github.com/OwnGhy/vue-fun-loading.git"
},

到這里所有的配置都完成了维贺,只剩下發(fā)布npm包了??。

發(fā)布npm包首先需要注冊一個npm 賬號巴帮,注冊之后登錄:

npm login

如果很久沒有登錄想要查看當(dāng)前登錄溯泣,使用:

npm who am i

登錄之后就可以發(fā)布包了:

npm publish

需要注意的是,每次發(fā)布包基本更新package.json中的版本號榕茧。

本地調(diào)試

  • npm install 相對路徑直接安裝相對路徑進(jìn)行調(diào)試垃沦,缺點是修改之后需要反復(fù)重新安裝
  • 使用npm link將模塊link到全局,然后在需要使用的項目中npm link xxx就可以了用押,調(diào)試完成之后再npm unlink xxx即可
    肢簿、
    調(diào)試參考:你所不知道的模塊調(diào)試技巧 - npm link

最后

最后的最后,推銷一下蜻拨,我開發(fā)了一個各種各樣loading效果的插件池充,感興趣的小伙伴可以參考一下: vue-fun-loading

嘿嘿嘿缎讼,開心????收夸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市血崭,隨后出現(xiàn)的幾起案子卧惜,更是在濱河造成了極大的恐慌厘灼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件序苏,死亡現(xiàn)場離奇詭異手幢,居然都是意外死亡捷凄,警方通過查閱死者的電腦和手機(jī)忱详,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跺涤,“玉大人匈睁,你說我怎么就攤上這事⊥按恚” “怎么了航唆?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長院刁。 經(jīng)常有香客問我糯钙,道長,這世上最難降的妖魔是什么退腥? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任任岸,我火速辦了婚禮,結(jié)果婚禮上狡刘,老公的妹妹穿的比我還像新娘享潜。我一直安慰自己,他們只是感情好嗅蔬,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布剑按。 她就那樣靜靜地躺著,像睡著了一般澜术。 火紅的嫁衣襯著肌膚如雪艺蝴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天鸟废,我揣著相機(jī)與錄音吴趴,去河邊找鬼。 笑死侮攀,一個胖子當(dāng)著我的面吹牛锣枝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兰英,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撇叁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了畦贸?” 一聲冷哼從身側(cè)響起陨闹,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤楞捂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后趋厉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寨闹,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年君账,在試婚紗的時候發(fā)現(xiàn)自己被綠了繁堡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡乡数,死狀恐怖椭蹄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情净赴,我是刑警寧澤绳矩,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站玖翅,受9級特大地震影響翼馆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜金度,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一应媚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧审姓,春花似錦珍特、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至酬姆,卻和暖如春嗜桌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辞色。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留相满,地道東北人层亿。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像立美,于是被迫代替她去往敵國和親匿又。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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