使用npm打包vue组件并发布到私服(一)

前言

模块化开发是提高开发效率的有效途径之一,最近抽时间研究了下vue打包,作为新手真的不容易,遇到一些坑,总结记录下。

正文

如标题所言,本文涉及的技术有三个:npm,vue,私服,其实还有一个:webpack,如果对以上技术都不熟悉的朋友也不要紧,本文作者也是一个新手,之前也都没接触到这些技术,也是通过这两天在网上找资料来了解这些技术,我会把我整理的链接贴出来供大家参考

npm:

npm 与 package.json 快速入门 - 前端 - 掘金

vue:

介绍 — Vue.js

私服搭建:

私有Nuget服务搭建总结 - 简书
Nexus Repository Manager 3 搭建 npm 私服 - 知乎

webpack:

入门Webpack,看这篇就够了 - 简书

大家看完以上文档资料,对这些技术有了个基本的了解,下面就开始进入主题了

使用npm打包vue组件并发布到私服这件事可以拆分成两个任务:

任务一:使用npm打包vue组件
任务二:把打包好的vue组件发布到私服

一:使用npm打包vue组件(知道的同学直接跳过)

首先我们开发一个custom-switch组件,效果如下:

最终展示效果

创建custom-switch文件夹,切换到当前目录,使 vue init webpack-simple 命令创建一个新项目 custom-switch:

创建vue项目.png

目录结构如下:

项目目录结构

在src同级目录创建一个packages目录,再在packages目录下创建switch目录,我们的组件代码就放到switch目录下面

在switch目录创建custom-switch.vue,index.js 两个文件

custom-switch.vue

<template>
  <div>
    <span class="weui-switch" :class="{'weui-switch-on' : me_checked}" :value="value" @click="toggle"></span>
  </div>
</template>

<script>
  export default {
    name: "CustomSwitch",
    props: {
      value: {
        type: Boolean,
        default: true
      }
    },
    data() {
      return {
        me_checked: this.value
      }
    },
    watch: {
      me_checked(val) {
        this.$emit('input', val);
      }
    },
    methods: {
      toggle() {
        this.me_checked = !this.me_checked;
      }
    }
  }
</script>

<style>
  .weui-switch {
    display: block;
    position: relative;
    width: 52px;
    height: 32px;
    border: 1px solid #DFDFDF;
    outline: 0;
    border-radius: 16px;
    box-sizing: border-box;
    background-color: #DFDFDF;
    transition: background-color 0.1s, border 0.1s;
    cursor: pointer;
  }

  .weui-switch:before {
    content: " ";
    position: absolute;
    top: 0;
    left: 0;
    width: 50px;
    height: 30px;
    border-radius: 15px;
    background-color: #FDFDFD;
    transition: transform 0.35s cubic-bezier(0.45, 1, 0.4, 1);
  }

  .weui-switch:after {
    content: " ";
    position: absolute;
    top: 0;
    left: 0;
    width: 30px;
    height: 30px;
    border-radius: 15px;
    background-color: #FFFFFF;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
    transition: transform 0.35s cubic-bezier(0.4, 0.4, 0.25, 1.35);
  }

  .weui-switch-on {
    border-color: #1AAD19;
    background-color: #1AAD19;
  }

  .weui-switch-on:before {
    border-color: #1AAD19;
    background-color: #1AAD19;
  }

  .weui-switch-on:after {
    transform: translateX(20px);
  }
</style>

index.js

import CustomSwitch from './custom-switch'

/* istanbul ignore next */
CustomSwitch.install = function(Vue) {
  Vue.component(CustomSwitch.name, CustomSwitch);
};

export default CustomSwitch;

再改下 webpack.config.js,方便打包和调试运行

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

const NODE_ENV = process.env.NODE_ENV

module.exports = {
  // 修改打包入口
  entry: NODE_ENV == 'development' ? './src/main.js' : './packages/switch/index.js',

  output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/',
    filename: 'custom-switch.js',
    library: 'custom-switch', // 指定的就是你使用require时的模块名
    libraryTarget: 'umd', // libraryTarget会生成不同umd的代码,可以只是commonjs标准的,也可以是指amd标准的,也可以只是通过script标签引入的
    umdNamedDefine: true // 会对 UMD 的构建过程中的 AMD 模块进行命名。否则就使用匿名的 define
  }
...

如果要执行 npm run dev 命令看效果的话,还需要修改 index.html,app.vue,main.js 代码我就不贴了,需要的同学 点击源代码下载地址

激动人心的时刻到了,切换到项目根目录运行 npm run build 看有没有生成dist目录,我这里是运行成功了

npm_run_build.png

到此为止,我们的 任务一:使用npm打包vue组件的任务也就做完了

二:把打包好的vue组件发布到私服

参考上面 私服搭建 的文档,把私服搭建好了

把vue组件发布到私服可以分为以下几个步骤:

1.创建npm仓库
2.发布组件

创建npm仓库

设置-->Repository-->Repositories-->Create repository

创建npm仓库_1.png

仓库类型选择 npm(hosted)

创建npm仓库_2.png

Name 随便起一个,点击Create Repository,创建完成,详情如下

创建npm仓库_3.png

接着要创建一个Roles
Security-->Roles-->Create role-->Nexus role

创建npm仓库_4.png

打勾的需要填写,其他默认就可以,点击 Create role 就创建了一个对应此仓库的一个role

接着要把当前创建的 test-vue-role 关联一个用户上面(我这里选择已经创建好的用户)
Users-->点击已经创建好的用户-->双击test-vue-role-->Save

创建npm仓库_5.png

这样npm仓库就创建好了,等等,好像还有一个配置 (-_-)zz,不配置的话就会发布不成功,报以下错误

npm_publish_error.jpg

Realms-->添加 npm BearerToken Realm-->Save

创建npm仓库_6.png

好了,现在我们把做好的vue组件发布试试!
先登录私服:
npm login --registry=http://xxx.xxx.xxx:xxxx/repository/vue-test/
输入账号
输入密码
输入邮箱

登录npm仓库.png

第一次需要登录,下次发布组件就需要登录了

发布组件,终于到了这一步骤...
npm publish --registry=http://xxx.xxx.xxx:xxxx/repository/vue-test/
很愉快的输入这一命令,

image.png

怎么还报错
发布组件_error.png

看提示,貌似需要把 package.json 中 private 属性移除,试试再说

发布组件.png

哈哈,果然,发布成功了,上私服看看

组件发布完成,上私服看结果.png

OK,看到已经发布到自己的私服上面了

下面我们新建一个项目引用下这个组件,命令行输入以下指令
安装指定的组件
npm install custom-switch --registry=http://xxx.xxx.xxx:xxxx/repository/vue-test/

引用组件.png

可以看到已经成功的添加了
ps:命令后加上 --verbose 可以看下详细日志

总结:介绍了怎么开发一个vue组件,怎么创建一个npm私服,怎么发布组件,怎么引用组件,还是比较基础的,只是完成这件事,当然也留下了不少问题,比如:每次发布都需要跟上一个地址,好麻烦,这个我会研究解决这个问题,组件源码已上传到github,下载地址:https://github.com/maoruiily/custom-switch

大家在实际做的过程中如果有遇到什么问题,可以留言

ps:如果把组件上传到公网npm中心,可以参考:https://juejin.im/post/5b45df255188251b1d474860

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容