vue 組件發布為npm包.md

npm 建立賬號

npm建立賬號

首先問題:開發中我們往往需要做某些功能,這個功能可能會出現很多次,也會出現在不同的項目。需要使用時候又不想重新寫,怎么辦呢?

解決思路:把這個特殊的需求功能做成屬于自己的組件,當下次需要去使用它的時候。那么我們就可以打包這個組件并上傳到npm管理庫,這個庫可以是自己的私有庫,也可以是npmjs公共庫。

一、初始化一個空項目

1、新建一個文件夾,然后進入到該文件夾目錄下,執行

npm init

初始化項目。然后會讓你填一些項目相關的信息,跟著提示填就是了。沒啥說的。注意name不要和現有的其他npm包重名了,不然一會兒發Npm包的時候會失敗,可以先去npmjs.com搜一下有沒有重名的。
這一步完成后,目錄下會生成package.json文件。

2、由于本教程是發布一個vue的組件包,而且使用了es6webpack,所以在devDependencies字段中,應該至少加入對應的依賴,可以參考我這個配置namenpm包的名稱,一定不能跟別人的重復,可以自己去npmjs.com 上面檢查下是否重復,否則提交不成功的
main 自己定義的程序的入口文件,比如我希望打包后是 dist/helloWorld.jsprivate 要設置為 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、執行npm install,下載這些依賴包。
4、項目根目錄下創建2個文件夾:distsrc,名字按照個人習慣可以變動。我習慣使用dist代表發布的目錄,src是開發目錄。dist文件夾里的js是到時候通過webpack打包后的文件。待會只會提交dist目錄到npm官網上,src不提交。

src里,我們創建一個常規的vue組件。hello-world.vue 內容大致如下:

<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>

接下來我們還需要創建一個js文件。index.js 內容如下(這里的寫法主要是把這個組件 export 出去):

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

5、接下來配置 webpack 打包,把src中的內容打包進 dist 目錄內:
根目錄下新增 webpack.config.js 大致內容如下:

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時的模塊名

    libraryTarget: 'umd', // 指定輸出格式
    umdNamedDefine: true // 會對 UMD 的構建過程中的 AMD 模塊進行命名。否則就使用匿名的 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
    })
  ])
}

然后執行npm run build,就會在dist目錄下生成helloWorld.js這個js即是我們這個npm包的主文件。

6、新建一個文件,名為.npmignore,是不需要發布到npm的文件和文件夾,規則和.gitignore一樣。如果你的項目底下有.gitignore但是沒有.npmignore,那么會使用.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

至此,一個npm組件包就做完了,剩下的,只是提交到npm官網去。

(如果要嚴謹點,當然還需要加入單元測試通過后再發包。。。但是。。。但是。。。

image

二、發布到NPM上的流程

1、前提,得有個npm賬號,沒有就新注冊一個賬號
https://www.npmjs.com/signup

2、進入到項目的根目錄下,運行 npm login 執行登錄
一般情況下回提示你輸入 你的用戶名,密碼和郵箱,若登錄成功一般會顯示:

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

3、登錄成功后就可以執行 npm publish 即可將這個npm包發布到npm官網。大概過個10來分鐘就可以搜索到并下載,我們執行npm install hello-world --save-dev 即可在自己的項目中import導入進來當做組件使用了。
4、更新包的時候,需要手動修改 package.json 中的version版本號,一般慣例都是+1,比如1.0.0 --> 1.0.1。更改完成后,分別執行打包、登錄npm、發布即可。

npm run build

npm login
npm publ
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容