Vue 自定义组件 上传至npm仓库

今天实现了一下自定义Vue组件,并上传至npm仓库,现在简单记录一下流程

1 创建简单的Vue项目

使用

vue init webpack-simple test-publish3

这里的test-publish3是vue项目名称
创建项目完毕后 得到以下目录结构

初始化项目结构

2 开始准备上传前的代码

2.1 修改目录结构

  • 将当前目录内的src修改为examples,用来等组件开发完毕本地测试使用
  • 新建packages目录,用来编写组件的代码
    此时,即可得到以下目录
    新的目录结构
  • 注意哦packagesexamples不是必须这个名字的,这个名字主要是为了方便好记所以这样命名,这个路径会在webpack.config.js中指定路径的时候用到。

2.2 新建组件代码

在路径: /packages/components/下创建三个Vue页面,分别命名为Mt1.vue, Mt2.vue, Mt3.vue
如下图:

示例组件代码

2.3 新建自定义指令代码

在路径: /packages/directive/下面新建两个自定义指令,分别命名为Dire1.js, Dire2.js

自定义指令文件

2.4 新建统一导出文件

在路径/packages/下面新建index.js文件,如下图所示

项目结构图

  • 内容如下
/**
 * 统一导出文件
 */
// 导入Vue组件
import Mt1 from './components/Mt1'
import Mt2 from './components/Mt1'
import Mt3 from './components/Mt1'

// 导入指令
import Dire1 from './directive/Dire1'
import Dire2 from './directive/Dire2'

// 存储组件列表
const components = [Mt1,Mt2,Mt3]
// 存储指令列表
const directives = {Dire1,Dire2}

// 定义install方法
const install = function (Vue) {
  // 遍历注册所有的组件
  components.map(com=>{
    Vue.component(com.name,com)
  })

  // 遍历所有的指令
  Object.keys(directives).map(key=>{
    Vue.directive(key,directives[key])
  })
}

// 引入
if(typeof window !== 'undefined' && window.Vue){
  install(window.Vue)
}

export default {
  install,
  // 组件列表
  ...components,
  // 指令列表
  ...directives
}

2.5 修改package.json文件

内容如下

{
  "name": "@yangxc/test-publish3", // 在接下来的流程会介绍  为什么填这个
  "description": "A Vue.js project",
  "version": "1.0.2",
  "author": "XXXXX",
  "license": "MIT",
  "private": false, // 需要将私有开放权限设置为false
  // 是一个字符串的数组。它可以帮助人们在使用npm search时找到这个包
  "keywords": [
    "test",
    "test-publish"
  ],
  "scripts": {
    "dev": "cross-env NODE_ENV=development webpack-dev-server --env --open --hot",
    "build": "cross-env NODE_ENV=production webpack --env --progress --hide-modules",
    // 加上这个npm run lib
    "lib": "cross-env NODE_ENV=production webpack --env.lib --progress --hide-modules"
  },
  "files": [
    // files字段是一个被项目包含的文件名数组
    "lib/test-publish3.js",
    "package.json",
    "README.md"
  ],
  // main字段用来指定入口文件
  "main": "lib/test-publish3.js",
  "dependencies": {
    "generator-standard-readme": "^1.0.6",
    "global": "^4.4.0",
    "vue": "^2.5.11",
    "yo": "^3.1.1"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ],
  "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",
    "vue-loader": "^13.0.5",
    "vue-template-compiler": "^2.4.4",
    "webpack": "^3.6.0",
    "webpack-dev-server": "^2.9.1"
  }
}

2.6 修改 webpack.config.js

  • 主要将原来的导出的对象修改为导出为函数,入参为env,为了方便本地使用npm run devnpm run lib均可以使用,互不影响。
var path = require('path')
var webpack = require('webpack')

module.exports = env =>{
  let lib = env.lib
  return {
    // 入口文件
    entry: lib? './packages/index.js':'./examples/main.js',
    // 出口文件
    output: {
      // 打包文件生成的路径
      path: path.resolve(__dirname, lib?'./lib':'./dist'),
      publicPath: lib?'/lib/':'/dist/',
      // 打包后的文件名
      filename: lib?'test-publish3.js':'build.js',
      /**
       * library 指的是用户使用时的require的模块名
       * 这里既是require('test-publish3')
       */
      library: lib?'test-publish3':'',
      libraryTarget: lib?'umd':'var',
      umdNamedDefine: !!lib
    },
    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)$/,
          loader: 'file-loader',
          options: {
            name: '[name].[ext]?[hash]'
          }
        }
      ]
    },
    resolve: {
      alias: {
        'vue$': 'vue/dist/vue.esm.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
      })
    ])
  }
}

2.6 代码编写完毕,本地测试一下

2.6.1 组件测试

  • 在目录: /examples/main.js中添加以下代码
    main.js
  • 作用: 模仿用户导入我们的组件


    使用组件

    效果图

2.6.2 指令测试

指令代码

效果图

OK 本地测试成功 开始发布到npm上

发布至npm

1.登录npm官网https://www.npmjs.com/

注册用户 并且创建一下组织,我建立的组织是yangxc,所以,package.json中的name上就是@yangxc/XXX

新建组织

2. 本地登录

  • 新建完毕后,就可以在本地登录了,操作如下:
    1. 设置npm代理环境,应该使用官方镜像,不能使用淘宝镜像 npm config set registry http://registry.npmjs.org
    1. 登录:npm login 随后输入必要的信息
    1. lib打包工程 : npm run lib 打包完毕
    1. 发布npm包: npm publish --access public
    1. 发布成功会返回:@yangxc/test-publish3@1.0.0
      发布成功

至此,npm已经将该包发布成功!

测试远程包是否可用

1. 打开npm 搜索名称 打开详情

npm包详情

2.新建test vue工程,添加该依赖npm i @yangxc/test-publish3,也可以使用yarn:yarn add @yangxc/test-publish3进行添加

测试工程

image.png

效果图如下

image.png

证明发布的组件是可用的!!

至此,从无到有的npm发布vue组件到npm仓库的简单记录就结束了,这只是初次接触npm发布的第一步,相信以后会更加熟练。

本文参考自: https://www.jianshu.com/p/a088d544ee28
多谢这位大佬,点赞!

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