vue 組件發(fā)布為npm包.md

npm 建立賬號(hào)

npm建立賬號(hào)

首先問題:開發(fā)中我們往往需要做某些功能嵌器,這個(gè)功能可能會(huì)出現(xiàn)很多次,也會(huì)出現(xiàn)在不同的項(xiàng)目蜒程。需要使用時(shí)候又不想重新寫,怎么辦呢伺帘?

解決思路:把這個(gè)特殊的需求功能做成屬于自己的組件昭躺,當(dāng)下次需要去使用它的時(shí)候。那么我們就可以打包這個(gè)組件并上傳到npm管理庫伪嫁,這個(gè)庫可以是自己的私有庫领炫,也可以是npmjs公共庫。

一张咳、初始化一個(gè)空項(xiàng)目

1帝洪、新建一個(gè)文件夾,然后進(jìn)入到該文件夾目錄下脚猾,執(zhí)行

npm init

初始化項(xiàng)目葱峡。然后會(huì)讓你填一些項(xiàng)目相關(guān)的信息,跟著提示填就是了龙助。沒啥說的砰奕。注意name不要和現(xiàn)有的其他npm包重名了,不然一會(huì)兒發(fā)Npm包的時(shí)候會(huì)失敗提鸟,可以先去npmjs.com搜一下有沒有重名的军援。
這一步完成后,目錄下會(huì)生成package.json文件称勋。

2胸哥、由于本教程是發(fā)布一個(gè)vue的組件包,而且使用了es6webpack赡鲜,所以在devDependencies字段中空厌,應(yīng)該至少加入對(duì)應(yīng)的依賴庐船,可以參考我這個(gè)配置namenpm包的名稱,一定不能跟別人的重復(fù)嘲更,可以自己去npmjs.com 上面檢查下是否重復(fù)醉鳖,否則提交不成功的
main 自己定義的程序的入口文件,比如我希望打包后是 dist/helloWorld.js哮内。private 要設(shè)置為 false

{
  "name": "hello-world",
  "description": "",
  "version": "1.0.0",
  "author": "十三月",
  "license": "MIT",
  "private": false,
  "main": "dist/helloWorld.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "webpack-dev-server --hot --inline",
    "build": "webpack --display-error-details --config webpack.config.js"
  },
  "dependencies": {
    "vue": "^2.5.11"
  },
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-preset-env": "^1.6.0",
    "babel-preset-stage-3": "^6.24.1",
    "cross-env": "^5.0.5",
    "css-loader": "^0.28.7",
    "file-loader": "^1.1.4",
    "style-loader": "^0.23.1",
    "stylus": "^0.54.5",
    "stylus-loader": "^3.0.2",
    "vue-loader": "^13.0.5",
    "vue-template-compiler": "^2.4.4",
    "webpack": "^3.12.0",
    "webpack-dev-server": ">=3.4.1"
  }
}

具體這些依賴都有什么用處自己查查就明白了。

3壮韭、執(zhí)行npm install北发,下載這些依賴包。
4喷屋、項(xiàng)目根目錄下創(chuàng)建2個(gè)文件夾:distsrc琳拨,名字按照個(gè)人習(xí)慣可以變動(dòng)。我習(xí)慣使用dist代表發(fā)布的目錄屯曹,src是開發(fā)目錄狱庇。dist文件夾里的js是到時(shí)候通過webpack打包后的文件。待會(huì)只會(huì)提交dist目錄到npm官網(wǎng)上恶耽,src不提交密任。

src里,我們創(chuàng)建一個(gè)常規(guī)的vue組件偷俭。hello-world.vue 內(nèi)容大致如下:

<template>
  <div>
    <h2>{{name}}</h2>
  </div>
</template>

<script>
  export default {
    name: "hello-world",
    components: {},
    props: {
      name: {
        type: String,
        default: ''
      }
    },
    data() {
      return {}
    },
    mounted() {

    },
    methods: {},
    destroyed() {
    }
  }
</script>

<style scoped>

</style>

接下來我們還需要?jiǎng)?chuàng)建一個(gè)js文件浪讳。index.js 內(nèi)容如下(這里的寫法主要是把這個(gè)組件 export 出去):

import helloWorld from './hello-world.vue'
export default helloWorld;

5、接下來配置 webpack 打包涌萤,把src中的內(nèi)容打包進(jìn) dist 目錄內(nèi):
根目錄下新增 webpack.config.js 大致內(nèi)容如下:

var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, './dist'),//輸出路徑淹遵,就是上步驟中新建的dist目錄
    publicPath: '/dist/',//路徑

    filename: 'helloWorld.js',//打包之后的名稱
    library: 'helloWorld', // 指定的就是你使用require時(shí)的模塊名

    libraryTarget: 'umd', // 指定輸出格式
    umdNamedDefine: true // 會(huì)對(duì) UMD 的構(gòu)建過程中的 AMD 模塊進(jìn)行命名。否則就使用匿名的 define
  },

  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          'vue-style-loader',
          'css-loader'
        ],
      },      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {
          }
          // other vue-loader options go here
        }
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.(png|jpg|gif|svg|eot|ttf|woff|woff2)$/,
        loader: 'file-loader',
        options: {
          name: '[name].[ext]?[hash]'
        }
      }
    ]
  },
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.js'
    },
    extensions: ['*', '.js', '.vue', '.json']
  },
  devServer: {
    historyApiFallback: true,
    noInfo: true,
    overlay: true
  },
  performance: {
    hints: false
  },
  devtool: '#eval-source-map'
}

if (process.env.NODE_ENV === 'production') {
  module.exports.devtool = '#source-map'
  // http://vue-loader.vuejs.org/en/workflow/production.html
  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
    new webpack.optimize.UglifyJsPlugin({
      sourceMap: true,
      compress: {
        warnings: false
      }
    }),
    new webpack.LoaderOptionsPlugin({
      minimize: true
    })
  ])
}

然后執(zhí)行npm run build负溪,就會(huì)在dist目錄下生成helloWorld.js透揣。這個(gè)js即是我們這個(gè)npm包的主文件。

6川抡、新建一個(gè)文件辐真,名為.npmignore,是不需要發(fā)布到npm的文件和文件夾猖腕,規(guī)則和.gitignore一樣拆祈。如果你的項(xiàng)目底下有.gitignore但是沒有.npmignore,那么會(huì)使用.gitignore里面的配置倘感。大致可以參考我的.npmignore

.DS_Store
node_modules/
dist/
build/
npm-debug.log
yarn-error.log
package-lock.json

# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln

至此放坏,一個(gè)npm組件包就做完了,剩下的老玛,只是提交到npm官網(wǎng)去淤年。

(如果要嚴(yán)謹(jǐn)點(diǎn)钧敞,當(dāng)然還需要加入單元測試通過后再發(fā)包。麸粮。溉苛。但是。弄诲。愚战。但是。齐遵。寂玲。

image

二、發(fā)布到NPM上的流程

1梗摇、前提拓哟,得有個(gè)npm賬號(hào),沒有就新注冊一個(gè)賬號(hào)
https://www.npmjs.com/signup

2伶授、進(jìn)入到項(xiàng)目的根目錄下断序,運(yùn)行 npm login 執(zhí)行登錄
一般情況下回提示你輸入 你的用戶名,密碼和郵箱糜烹,若登錄成功一般會(huì)顯示:

`Logged in as` 你的名字 `on https://registry.npmjs.org/`.

3违诗、登錄成功后就可以執(zhí)行 npm publish 即可將這個(gè)npm包發(fā)布到npm官網(wǎng)。大概過個(gè)10來分鐘就可以搜索到并下載景图,我們執(zhí)行npm install hello-world --save-dev 即可在自己的項(xiàng)目中import導(dǎo)入進(jìn)來當(dāng)做組件使用了较雕。
4、更新包的時(shí)候挚币,需要手動(dòng)修改 package.json 中的version版本號(hào)亮蒋,一般慣例都是+1,比如1.0.0 --> 1.0.1妆毕。更改完成后慎玖,分別執(zhí)行打包、登錄npm笛粘、發(fā)布即可趁怔。

npm run build

npm login
npm publ
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市薪前,隨后出現(xiàn)的幾起案子润努,更是在濱河造成了極大的恐慌,老刑警劉巖示括,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铺浇,死亡現(xiàn)場離奇詭異,居然都是意外死亡垛膝,警方通過查閱死者的電腦和手機(jī)鳍侣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門丁稀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人倚聚,你說我怎么就攤上這事线衫。” “怎么了惑折?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵授账,是天一觀的道長。 經(jīng)常有香客問我惨驶,道長矗积,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任敞咧,我火速辦了婚禮,結(jié)果婚禮上辜腺,老公的妹妹穿的比我還像新娘休建。我一直安慰自己,他們只是感情好评疗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布测砂。 她就那樣靜靜地躺著,像睡著了一般百匆。 火紅的嫁衣襯著肌膚如雪砌些。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天加匈,我揣著相機(jī)與錄音存璃,去河邊找鬼。 笑死雕拼,一個(gè)胖子當(dāng)著我的面吹牛纵东,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啥寇,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼偎球,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辑甜?” 一聲冷哼從身側(cè)響起衰絮,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎磷醋,沒想到半個(gè)月后猫牡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡子檀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年镊掖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乃戈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亩进,死狀恐怖症虑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情归薛,我是刑警寧澤谍憔,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站主籍,受9級(jí)特大地震影響习贫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜千元,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一苫昌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幸海,春花似錦祟身、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挡篓,卻和暖如春婉陷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背官研。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國打工秽澳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戏羽。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓肝集,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛛壳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杏瞻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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