前端多个vue项目公共组件的三种方法(推荐npm file引入)_npm本地file-程序员宅基地

技术标签: 前端公共组件  前端公共项目  npm link  

背景

目前很多公司的开发模式都是多个前端一个后端。笔者所在的公司就是这样,移动端前端的产品有两个,这两个产品有很多内容是相似的、甚至一样的。包括页面、样式、JS逻辑等。这样就想将这些公共部分封装成公共组件供这两个项目调用。

Vue很好的提供了单个项目公共组件的解决方案,包括组件复用、传参、监听、通讯、插槽等功能。但多个vue项目怎么使用公共组件呢。

这篇文章就来介绍前端多个vue项目公共组件的三种方法,npm发布引用、npm link、npm本地file引用,其中本文主要推荐本地file引用方式,若嫌篇幅太长可直接翻到文章最后查看npm本地file引用方式。

准备工作

本示例代码的git地址请点击此查看

创建项目

笔者使用vue cli3来创建项目,vue cli3官网地址。首先创建三个项目,project1、project2、common,其中common是公共组件,project1和project2引用了common包。

#创建命令如下
vue create project1
vue create project2
vue create common
common包入口

创建完成后删除common包一些无用的东西,修改package.json,增加一行
"main": "index.js",
这表明index.js就是common包的入口文件,然后创建index.js文件。

依赖第三方包

因为要使用picker,这里引用的是WeVue,正好也演示一下common包依赖第三方组件的实现。
要注意的是:
1.在index.js中需初始化第三方引用包这里引用WeVue,初始化代码如下

import WeVue from 'we-vue'
import 'we-vue/lib/style.css'
import Vue from 'vue'
Vue.use(WeVue)

2.若是以本文推荐的npm本地file引入common包,common包引入了第三方组件,则project1和project2中必须也引入第三方包,并在main.js中初始化。

创建组件

然后在common包中创建一个组件,这里创建一个playerPicker做示例,功能是音乐播放器,供project1和project2引用,由于篇幅控制,代码可去git查看。

index.js

index.js中需包含上面说的第三方组件初始化和公共组件的导出,本示例完整内容如下

import WeVue from 'we-vue'
import 'we-vue/lib/style.css'
import Vue from 'vue'
import playerPicker from './src/components/playerPicker'
Vue.use(WeVue)
export {
    
  playerPicker
}

最后结构图如下:
项目结构图
project2和project1一样,这里就只演示project1引用common的实现。

方案一:npm发布引用

我们可以采取专人维护common包的方式,common的组件编写完成后,将其发布到npm。
发布流程如下:

  1. 在注http://www.npmjs.com册一个账号
  2. 进入common的控制台,输入命令npm login,按照提示输入刚注册的账号密码
  3. 输入命令 npm publish 即可

当然common这个名字肯定被注册了,这里只做示例,真正使用时需使用一个未在npm中注册的包名。需要注意的是,若报错你没有权限发布该项目,那应该就是你的这个项目名被别人用过了,在package.json中修改下项目名再发布吧。

开发project1和project2的程序猿通过npm install命令将common以node_module的方式引入

npm install common --save

另外,每次改动代码再次发布时,需要修改package.json文件中的版本号,不然发布不成功。

这样开发project1和project2的程序猿只需关注自己项目的业务功能,公共的common有更新时,执行命令npm install common就可以了。

不过这个方案的问题,频繁改动common包时,project1和project2需要频繁更新common包的引入。

方案二:npm link

首先进入common包,在控制台输入

npm link

这会创建一个软连接,并保存到目录C:\Users\Administrator\AppData\Roaming\npm\node_modules下面。

然后进入project1和project2,在控制台输入

npm link common

这就将这个公共的项目通过软连接的方式引入到项目里面来了。下图可以看到在node_modules中common包和其他的包文件夹样式是不一样的,common文件夹只是一个软链接。
common包软链接
这时修改common项目下面的任意代码都会实时生效,不用打包,不用更新引入包,也不用重启。

需要注意的是,当项目包依赖更新后,也就是执行了 npm install xxx 之后,需要重新link common项目。而且使用npm link后本地package.json里没有记录,无法直观的查看本地包的引用。

方案三:npm本地file引用(推荐)

分别进入project1和project2,在控制台输入命令:

npm install ../common/

其中…/common/是common的相对路径,这里也可以输入绝对路径。

这样就将common这个工程以node_module的方式引入到project1和project2项目中了。可以正常使用common在index.js中导出的组件了。

命令执行完后,package.json里会多一条记录

  "dependencies": {
    
    "common": "file:../common",
    "core-js": "^3.3.2",
    "vue": "^2.6.10",
    "vue-router": "^3.1.3",
    "vuex": "^3.0.1",
    "we-vue": "^2.3.3"
  },

也可以在package.json里加上"common": “file:…/common” 这一行再执行npm install命令。

同样这时修改common项目下面的任意代码都会实时生效,不用打包,不用更新引入包,也不用重启。而且在package.json中有引入记录。

引入公共组件

公共组件创建好了,需要引入,引入代码和引入其他组件的方式一样,代码如下:

<template>
  <div class="hello">
    <h1 style="text-align: center;">{
    {
     msg }}</h1>
    <player-picker :audios="audios"></player-picker>
  </div>
</template>
<script>
import {
     playerPicker } from 'common'
export default {
    
  name: 'HelloWorld',
  components: {
     playerPicker },
  data () {
    
    return {
    
      msg: '音乐播放器',
      audios: [{
    
        audioSrc: 'https://m801.music.126.net/20191121202654/e1b93f2bbd9a741dbb6afb2fba7fab8d/jdyyaac/010b/5359/565d/6a7ed7d40cd34dea3ddda7779a460973.m4a',
        duration: 326,
        title: '天涯'
      }, {
    
        audioSrc: 'http://audio04.dmhmusic.com/71_53_T10041182782_128_4_1_0_sdk-cpm/cn/0208/M00/31/B1/ChR461plD6yARfTFAEEIKD_hxsU439.mp3?xcode=8a44d93c492e630856e62a602d6c4faf12cc3f2',
        duration: 266,
        title: '伤心太平洋'
      }, {
    
        audioSrc: 'http://audio04.dmhmusic.com/71_53_T10041184599_128_4_1_0_sdk-cpm/cn/0208/M00/31/B5/ChR47FplIpCAEaVVAEZqHtp44Ks826.mp3?xcode=e8a16a5aa7bb2e5b56e57822bb09de2b96fca9a',
        duration: 288,
        title: '难念的经'
      }]
    }
  }
}
</script>

最后实现结果
音乐播放器

后续

在实际使用npm file中,会遇到不少坑,《这篇文章》会讲述笔者遇到的2个问题并给出解决方案

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/milugloomy/article/details/103187370

智能推荐

JavaScript中的(内置)方式来检查字符串是否为有效数字_js 判断是的有效数字-程序员宅基地

文章浏览阅读1.2k次。我希望在与旧的VB6 IsNumeric()函数相同的概念空间中有东西吗? _js 判断是的有效数字

PHP5.4NTS MYSQL_windows安装Apache2.4.3(mod_fcgi)+PHP5.4.10+Mysql5.5.29-程序员宅基地

文章浏览阅读129次。最近有朋友问我,根据我的以前的一个教程,用php5apache2_4.dll来运行php的http://www.myxzy.com/post-333.html,但是现在apachelounge官网没有php5apache2_4.dll文件下载了,只有一个mod_fcgid了,php的包里面也没有php5apache2_4.dll这个文件。所以就写了这个教程。这个教程是在windows下用Apach..._windows 安装apahce2.4安装mod_fcgid.so

三分钟教你如何用Github找开源项目--值得一看!_github 网站 下载课题相关的开源代码程序。-程序员宅基地

文章浏览阅读10w+次。Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub。# 按照项目名/仓库名搜索(大小写不敏感)in:name xxx # 按照README搜索(大小写不敏感)in:readme xxx# 按照description..._github 网站 下载课题相关的开源代码程序。

MAC地址表、端口安全、MAC地址偏移-程序员宅基地

文章浏览阅读1.4k次,点赞7次,收藏6次。文章目录MAC地址1.组成2.分类3.常见MAC地址4.MAC地址表MAC地址表分类2.端口安全安全MAC地址分类端口安全保护动作配置端口安全经常使用的场景MAC地址偏移出现场景如何避免MAC地址漂移检测MAC地址MAC(Media Access Control Address)地址:网络中每台设备都有一个唯一的网络标识。1.组成MAC地址为48位(6字节)前24bit是通过向IETF等机构申请用来表示厂商的代码,后24bit是厂商分配给产品的唯一数值。2.分类物理MAC地址:MAC地址的_mac地址偏移

KEIL调试正在运行的程序_keil attach-程序员宅基地

文章浏览阅读2k次。有时程序跑着跑着就飞了,但此时却没有接仿真器,不能停下来看运行状态。如果重新启动调试,会破坏现场。有没有办法attach到应用程序上调试呢?答案是肯定的。_keil attach

【JavaScript】JS执行机制--同步与异步_js 同步和异步的展示-程序员宅基地

文章浏览阅读5.6k次,点赞41次,收藏30次。## 单线程`JavaScript`语言具有单线程的特点,同一个时间只能做一件事情。这是因为`JavaScript`脚本语言是为了处理页面中用户的交互,以及操作`DOM`而诞生的。如果对某个`DOM`元素进行添加和删除,不同同时进行。应该是先添加,再删除,事件有序。单线程的特点是所有任务都需要排队进行,前一个任务结束,才会执行后一个任务。这样会导致问题:如果JS执行时间过长,这样会导致页面渲染不连贯,导致页面渲染加载阻塞。_js 同步和异步的展示

随便推点

课程设计--计算机钢琴_计算机钢琴程序编写程序,程序运行时使 pc 机成为一架可弹奏的钢琴,当按下数字-程序员宅基地

文章浏览阅读2.7k次。计算机钢琴_计算机钢琴程序编写程序,程序运行时使 pc 机成为一架可弹奏的钢琴,当按下数字

用python动手学统计学_3-1使用python进行描述统计:单变量_num is deprecated and will be removed in python 3.-程序员宅基地

文章浏览阅读478次。基于python 3.9,使用pycharm community实现,本人水平非常菜,想要开始学习知识。内容基于这本书和一些网上资料如菜鸟网站等进行补充数学公式使用mathtype3-1使用python进行描述统计:单变量3-1-1统计分析与scipyimport scipy as sp3-1-2单变量的操作只有一种类型的数据import scipy as spimport numpy as npfish_data = np.array([2,3,3,4,4,4,4,5,5,6_num is deprecated and will be removed in python 3.14; use ast.constant 怎么

JS之前台参数提交到后台,双引号转义为"解决办法-程序员宅基地

文章浏览阅读1.5k次。问题描述var param = $("#searchForm").serializeJson();前台封装好了键值对形式的字符串,使用了EasyUI的treeGrid控件,传到后台后,双引号转义为&quot;解决办法apache工具包common-lang中有一个很有用的处理字符串的工具类,其中之一就是StringEscapeUtils,利用此工具类进行解决问题...

vscode代码片段置顶_vscode置顶代码-程序员宅基地

文章浏览阅读1.9k次。默认情况下,我们自定义的代码片段在 VSCode 的智能提示中优先级是比较低的,这往往并不符合我们的预期。那么,我们该如何提升自定义代码片段的优先级呢?首先,打开用户设置。然后,搜索 snippet。最后,将 editor.snippetSuggestions 设为 top 即可。..._vscode置顶代码

百万级PHP网站架构工具箱,高并发架构方案_1000并发 架构php-程序员宅基地

文章浏览阅读7.2k次。在了解过世界最大的PHP站点,Facebook的后台技术后,今天我们来了解一个百万级PHP站点的网站架构:Poppen.de。Poppen.de是德国的一个社交网站,相对Facebook、Flickr来说是一个很小的网站,但它有一个很好的架构,融合了很多技术,如 Nigix、MySql、CouchDB、Erlang、Memcached、RabbitMQ、PHP、Graphite、Red5以及Tsu_1000并发 架构php

数据结构中的C语言编程基础_编写数据结构的格式c语言-程序员宅基地

文章浏览阅读3.2k次,点赞28次,收藏123次。C语言进行编程时一脸懵?对于数据结构中的数据类型不会定义?基本的算法不会写、记不住?来看一看这篇文章,提前根据考研的要求进行算法的编写,帮助你在考研时轻松拿分!_编写数据结构的格式c语言

推荐文章

热门文章

相关标签