最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue封裝組件并上傳到npm的教程詳解

 更新時(shí)間:2024年04月20日 10:02:21   作者:學(xué)學(xué)學(xué)無(wú)止境  
這篇文章主要為大家詳細(xì)介紹了Vue封裝組件并上傳到npm的相關(guān)教程,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下

環(huán)境準(zhǔn)備

1.注冊(cè)npm賬號(hào):npm | Home (npmjs.com)

2.保證當(dāng)前環(huán)境安裝了vue、webpack、node,以下工作將在該環(huán)境下進(jìn)行(沒(méi)有的小伙伴自行百度安裝哈~)

3.一下用到的環(huán)境版本

  • webpack:v5.1.4
  • node:v12.10.0
  • vue:v2.6.14

4.創(chuàng)建一個(gè)基于webpack的vue項(xiàng)目,這個(gè)項(xiàng)目將會(huì)是我們的組件項(xiàng)目了。

目錄結(jié)構(gòu)構(gòu)建

在我們?nèi)粘i_(kāi)發(fā)的項(xiàng)目中,通常的目錄結(jié)構(gòu)可能會(huì)像下圖,我們一般會(huì)在根目錄下的src/views中進(jìn)行我們所有頁(yè)面的開(kāi)發(fā),App.vue作為主頁(yè)面引入。

但是呢,我們現(xiàn)在是想要進(jìn)行組件開(kāi)發(fā),那么在項(xiàng)目的目錄結(jié)構(gòu)上可根據(jù)個(gè)人習(xí)慣進(jìn)行一定的調(diào)整和更改如下:

 這里我說(shuō)明一下主要的目錄

  • components:存放你所需要開(kāi)發(fā)的所有組件的目錄
  • components/lib:存放組件源碼
  • components/css:存放可能需要用到的css樣式(自定義)
  • components/lib/xxx/index.js:將組件注冊(cè)魏全局組件
  • examples:最初項(xiàng)目的src,我們可以一邊開(kāi)發(fā)一邊調(diào)試

注意:更改上述目錄之后,配置文件也需要進(jìn)行相應(yīng)的改變,因?yàn)樵趙ebpack中,默認(rèn)以sec/main.js作為入口文件,現(xiàn)我們已將scr->example,所以入口文件應(yīng)該進(jìn)行相應(yīng)的修改

組件開(kāi)發(fā)

這里以Loading組件為例,

  • components/lib/Loading/src/Loading.vue:組件源碼
  • components/lib/Loading/src/index.js:?jiǎn)蝹€(gè)注冊(cè)全局組件
  • components/css/loading.scss:存放Loading組件的樣式(這里使用的是scss方式,后面關(guān)于打包會(huì)提到)
  • components/lib/index.js:所有組件的全局注冊(cè)

代碼實(shí)例如下:

components/lib/Loading/src/Loading.vue

<template>
	<div class="beva-loading">
		<img class="loading-icon" :src="imgSrc" alt="">
	</div>
</template>
<script>
	export default {
  name: 'Loading',
  props: {
    imgSrc: {
      type: String,
      default: ''
    },
  },
  data() {
		return {}
	}
}
</script>

components/lib/Loading/src/index.js

import Loading from './src/Loading.vue'
 
Loading.install = function (Vue) { 
  Vue.component(Loading.name, Loading)
}
export default Loading

components/css/loading.scss

	.beva-loading {
	  background-color: rgba(0, 0, 0, 0.7);
	  border-radius: 0.4rem;
	  color: #ffffff;
	  position: fixed;
	  z-index: 99;
	  width: 7.46rem;
	  height: auto;
	  padding: 0.8rem;
	  text-align: center;
	  top: 20vh;
	  box-sizing: border-box;
	  margin-left: -3.73rem;
	  left: 50%;
	}
	.loading-icon {
	  width: 4rem;
	  height: 4rem;
	  animation: rotatingright 1s linear infinite;
    }
	/*自定義動(dòng)畫類----順時(shí)針旋轉(zhuǎn)(使用這個(gè)動(dòng)畫的時(shí)候才設(shè)置動(dòng)畫執(zhí)行時(shí)間)*/
	@keyframes rotatingright {
	  transform-origin: 50% 50%;
	  0% {
	    transform: rotate(0deg);
	  }
	  50% {
	    transform: rotate(180deg);
	  }
	  100% {
	    transform: rotate(360deg);
	  }
	}
 
	/*自定義動(dòng)畫類----逆時(shí)針旋轉(zhuǎn)(使用這個(gè)動(dòng)畫的時(shí)候才設(shè)置動(dòng)畫執(zhí)行時(shí)間)*/
	@-webkit-keyframes rotatingleft {
	  0% {
	    -webkit-transform: rotate(0deg);
	  }
	  50% {
	    -webkit-transform: rotate(-180deg);
	  }
 
	  100% {
	    -webkit-transform: rotate(-360deg);
	  }
	}

components/lib/index.js

// 將組件庫(kù)中定義的所有組件引進(jìn)來(lái),然后再導(dǎo)出
import Demo from './demo';
import Card from './card';
import Loading from './Loading';
 
const components = {
  Demo,
  Card,
  Loading
}
const install = function (Vue) { 
  // 判斷是否安裝,安裝過(guò)就不繼續(xù)往下執(zhí)行
  if (install.installed) return
  Object.keys(components).forEach(component => { 
    Vue.component(components[component].name, components[component])
  })
}
export default {
  install
}

新建webpack.components.js文件,其中主要是對(duì)組件打包的配置

1.對(duì)打包輸出的文件進(jìn)行處理

2.如果用到了scss、css,圖片,則還需要對(duì)這些文件進(jìn)行額外處理

主要配置如下(其中有相關(guān)的注釋,有興趣可以自行查看)

const { VueLoaderPlugin } = require('vue-loader');
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
const glob = require('glob')
const path = require('path')
const list = {}// 動(dòng)態(tài)導(dǎo)入多個(gè)組件的入口文件
// 封裝組件的一些配置,因?yàn)榻M件打包是單獨(dú)打包的,所以需要單獨(dú)配置
async function makeList (dirPath, list) {
  // 拿到所有的入口文件的路徑
  const files = await glob.sync(`${dirPath}/**/index.js`)//[ 'components/lib/button/index.js', 'components/lib/icon/index.js']
  // 取出上一級(jí)目錄的文件名
  files.forEach(file => {
    let name = file.split('/')[2]
    // 判斷name是否有后綴名,有的話去除
    if (name.includes('.')) {
      name = name.split('.')[0]
    }
    list[name] = `./${file}`
  })
  // console.log(list)
}
makeList('components/lib', list)
module.exports = {
  entry: list,
  mode:'development',
  output: {
    filename: '[name].umd.js',// webpack打包的時(shí)候會(huì)將name替換成入口的name名字,例如card.umd.js
    path: path.resolve(__dirname, 'dist'),
    library:'mui',
    libraryTarget: 'umd',// 指定輸出格式,umd是一種模塊,兼容了CommonJS、AMD、CMD
  },
  plugins: [
    new VueLoaderPlugin(),
    new CleanWebpackPlugin()
  ],
  module: {
    // 配置rules,即什么樣的文件,使用什么樣的loader
    rules: [
      {
        test: /\.vue$/,
        use: [
          {
            loader: 'vue-loader',
          }
        ]
      },
      {
        test: /\.css$/,
        use: ['style-loader','css-loader']
      },// 這里只處理了css,而項(xiàng)目中組件中使用了scss文件,對(duì)于scss文件的處理這里使用的是gulp,下面會(huì)提到
      {
        test: /\.(png|jpg|gif|svg)$/i, // 匹配圖片文件格式
        type: 'asset/resource', // 使用內(nèi)置的asset模塊處理資源文件
        generator: {
          filename: 'images/[name][ext]', // 輸出的文件名格式
        },
      },
    ],
  },
}
  

ps:對(duì)于組件中使用的scss文件的處理,這里用到的是gulp,具體設(shè)置如下:

新建gulpfile.js,對(duì)css文件單獨(dú)打包(下方用到的第三方依賴需要自定下載

const gulp = require('gulp');
// 需要把樣式代碼導(dǎo)入
const sass = require('gulp-sass')(require('sass'));
// 對(duì)css代碼進(jìn)行壓縮
const minifyCSS = require('gulp-minify-css');
gulp.task('sass', async function () {
  return gulp.src('components/css/**/*.scss')
    .pipe(sass())// 將scss代碼轉(zhuǎn)換成css代碼
    .pipe(minifyCSS())// 壓縮css代碼
    .pipe(gulp.dest('dist/css'))// 輸出到打包目錄
})

接下來(lái)就是新增打包命令:

在package.json文件中

最后的打包文件如下:

上傳npm

修改package.json文件

在上傳npm之前呢,我們有必要對(duì)這個(gè)組件庫(kù)信息進(jìn)行相應(yīng)的配置,因?yàn)閚pm上發(fā)布的包是根據(jù)package.json的文件進(jìn)行匹配的,所以,進(jìn)行如下信息修改,一般指定如下信息

  • 刪除私有屬性private
  • description:描述
  • main:入口文件
  • keywords:關(guān)鍵字(方便用戶搜索)
  • author:作者信息
  • files:望發(fā)布的文件目錄(不需要將所有文件都上傳到npm中)

距離如下:

添加md文件

打包&&發(fā)布

由于這里封裝組件的方式是打包發(fā)布的方式,所以切記在發(fā)布之前進(jìn)行打包,生成dist文件!

維護(hù)版本

手動(dòng)修改package.json中的version或者執(zhí)行npm version patch生成迭代一個(gè)版本

執(zhí)行打包命令

npm run build

登陸npm

注意這一需要登陸官方倉(cāng)庫(kù),如果之前連接的是淘寶鏡像需要線切換回來(lái)。下面是查看倉(cāng)庫(kù)源和切換倉(cāng)庫(kù)的命令。

npm config get registry  // 查看倉(cāng)庫(kù)源
npm config set registry https://registry.npm.taobao.org
npm config set registry http://registry.npmjs.org 

登陸npm,輸入賬號(hào)、密碼、郵箱

npm login

發(fā)布

npm publish

測(cè)試組件

安裝

npm i vue-library-ui

引入&&使用 

頁(yè)面

擴(kuò)展

我在這個(gè)的基礎(chǔ)上封裝了另外一個(gè)組件vue2-edit-cron,主要是可以快速構(gòu)建cron表達(dá)式,有興趣也可以看看~:vue2-edit-cron - npm (npmjs.com)

總結(jié)

該文組件封裝的方式其實(shí)是打包發(fā)布的方式,這種方式是將裝好的組件最終打包成一個(gè)或者多個(gè)js文件發(fā)布。這種方式使得開(kāi)發(fā)和調(diào)試時(shí)更接近于一個(gè)前端項(xiàng)目。但是一旦引入圖片等靜態(tài)資源需要同個(gè)BASE64的方式打包到j(luò)s,而對(duì)于字體一類較大的靜態(tài)資源則根本無(wú)法引用

適用范圍:沒(méi)有或極少的依賴第三方插件、圖片的組件的封裝或JS方法的封裝

后面經(jīng)過(guò)了解知道,其實(shí)還有另外一種方式即,非打包方式,具體的對(duì)比如下:

打包發(fā)布非打包發(fā)布
webpack需要配置無(wú)需配置
發(fā)布發(fā)布前需要打包發(fā)布前無(wú)需打包
引用靜態(tài)文件較小的圖片可以通過(guò)BASE64方式打包僅js文件隨意使用
引用第三方依賴可以引用,但如果第三方依賴包含較多的靜態(tài)文件時(shí)可能會(huì)出現(xiàn)引用不到的情況隨意引用
被應(yīng)用的文件一個(gè)打包好的js組件的入口文件
調(diào)試方法在組件項(xiàng)目中即可調(diào)試需要在引用組件的項(xiàng)目中的node_module中對(duì)用模塊中調(diào)試

以上就是Vue封裝組件并上傳到npm的教程詳解的詳細(xì)內(nèi)容,更多關(guān)于Vue封裝組件上傳到npm的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue2.0 事件的廣播與接收(觀察者模式)

    Vue2.0 事件的廣播與接收(觀察者模式)

    這篇文章主要介紹了Vue2.0 事件的廣播與接收(觀察者模式),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Vue父子組件通信全面詳細(xì)介紹

    Vue父子組件通信全面詳細(xì)介紹

    這篇文章主要介紹了React中父子組件通信詳解,在父組件中,為子組件添加屬性數(shù)據(jù),即可實(shí)現(xiàn)父組件向子組件通信,文章通過(guò)圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-10-10
  • Vxe Table+Vue2封裝及使用方式

    Vxe Table+Vue2封裝及使用方式

    本文將詳細(xì)介紹如何在 Vue2 項(xiàng)目中對(duì) Vxe Table 進(jìn)行封裝,并給出實(shí)際使用示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Vue使用預(yù)渲染代替SSR的方法

    Vue使用預(yù)渲染代替SSR的方法

    這篇文章主要介紹了Vue使用預(yù)渲染代替SSR的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 詳解vue項(xiàng)目中如何加載markdown

    詳解vue項(xiàng)目中如何加載markdown

    這篇文章主要為大家詳細(xì)介紹了在vue項(xiàng)目中如何加載markdown,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • Vue中使用element-ui給按鈕綁定一個(gè)單擊事件實(shí)現(xiàn)點(diǎn)擊按鈕就彈出dialog對(duì)話框

    Vue中使用element-ui給按鈕綁定一個(gè)單擊事件實(shí)現(xiàn)點(diǎn)擊按鈕就彈出dialog對(duì)話框

    最近遇到了個(gè)需求是使用element-ui插件編寫頁(yè)面,點(diǎn)擊按鈕,彈出對(duì)話框,這篇文章主要給大家介紹了關(guān)于Vue中使用element-ui給按鈕綁定一個(gè)單擊事件實(shí)現(xiàn)點(diǎn)擊按鈕就彈出dialog對(duì)話框的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Vue動(dòng)態(tài)數(shù)據(jù)實(shí)現(xiàn)?el-select?多級(jí)聯(lián)動(dòng)、數(shù)據(jù)回顯方式

    Vue動(dòng)態(tài)數(shù)據(jù)實(shí)現(xiàn)?el-select?多級(jí)聯(lián)動(dòng)、數(shù)據(jù)回顯方式

    這篇文章主要介紹了Vue動(dòng)態(tài)數(shù)據(jù)實(shí)現(xiàn)?el-select?多級(jí)聯(lián)動(dòng)、數(shù)據(jù)回顯方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • vue使用自定義指令來(lái)控制頁(yè)面按鈕組的權(quán)限思想

    vue使用自定義指令來(lái)控制頁(yè)面按鈕組的權(quán)限思想

    這篇文章主要介紹了vue使用自定義指令來(lái)控制頁(yè)面按鈕組的權(quán)限思想,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue基于v-charts封裝雙向條形圖的實(shí)現(xiàn)代碼

    vue基于v-charts封裝雙向條形圖的實(shí)現(xiàn)代碼

    這篇文章主要介紹了vue基于v-charts封裝雙向條形圖的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • vue-cli腳手架的安裝教程圖解

    vue-cli腳手架的安裝教程圖解

    vue-cli腳手架模板是基于node下的npm來(lái)完成安裝,這篇文章主要介紹了vue-cli腳手架的安裝教程圖解 ,需要的朋友可以參考下
    2018-09-09

最新評(píng)論

新化县| 清涧县| 祁东县| 丹江口市| 湘潭县| 永丰县| 乌拉特前旗| 岑巩县| 峨山| 双鸭山市| 霍邱县| 保康县| 磐安县| 环江| 洪泽县| 青浦区| 米泉市| 临夏市| 称多县| 都匀市| 枣庄市| 道真| 福泉市| 华蓥市| 时尚| 金堂县| 岳池县| 房产| 漳州市| 民乐县| 平阴县| 会理县| 耒阳市| 建水县| 柘城县| 南康市| 石景山区| 宁强县| 黄大仙区| 湖州市| 武川县|