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

Vue多組件倉(cāng)庫(kù)開(kāi)發(fā)與發(fā)布詳解

 更新時(shí)間:2019年02月28日 10:12:44   作者:Fanz  
這篇文章主要介紹了Vue多組件倉(cāng)庫(kù)開(kāi)發(fā)與發(fā)布詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

在開(kāi)發(fā)組件時(shí),我們可能會(huì)期望一類組件放在同一個(gè)代碼倉(cāng)庫(kù)下,就像element那樣,我們可以使用element提供的腳手架,也可以使用vue cli 3創(chuàng)建一個(gè)更‘新'的項(xiàng)目。

項(xiàng)目創(chuàng)建

通過(guò)vue cli 3創(chuàng)建項(xiàng)目,創(chuàng)建文件夾packages用于存放組件。

單個(gè)組件目錄

在packages下就是每一個(gè)組件,每個(gè)組件和單獨(dú)項(xiàng)目一樣,會(huì)有package.json、README.md、src、dist等文件及目錄。

如何演示/調(diào)試組件

在組件開(kāi)發(fā)過(guò)稱中,我們需要對(duì)組件進(jìn)行展示,所以創(chuàng)建了examples文件夾,用于存放每個(gè)組件示例。

通過(guò)一個(gè)列表展示出所有的組件,點(diǎn)擊選擇當(dāng)前開(kāi)發(fā)的組件,進(jìn)入對(duì)應(yīng)的example。

路由的根就是一個(gè)導(dǎo)航列表,然后每個(gè)組件對(duì)應(yīng)一個(gè)路由,通過(guò)一個(gè)配置文件的components.js來(lái)生成這個(gè)路由。

// 路由
import Navigation from "./Navigation";
import components from "./components";

let routes = components.map(component => ({
 path: `/${component.name}`,
 component: () => import(`../examples/${component.name}`)
}));

routes.unshift({
 path: "",
 component: Navigation
});

export default routes;

自動(dòng)化腳本

創(chuàng)建/編譯/發(fā)布

創(chuàng)建新的組件,需要修改components.js配置文件,在examples和packages下創(chuàng)建對(duì)應(yīng)目錄。

編譯/發(fā)布組件,因?yàn)閭}(cāng)庫(kù)下會(huì)有多個(gè)組件,如果一次發(fā)布多個(gè),就需要進(jìn)入每個(gè)文件夾下執(zhí)行命令。

上面過(guò)程實(shí)現(xiàn)自動(dòng)化,有很多種方式,比如可以通過(guò)npm run <script>,可以直接通過(guò)node命令等。這里我參考element,采用了Makefile。

創(chuàng)建script文件夾,其中包括創(chuàng)建腳本new.js和構(gòu)建腳本build.js。

創(chuàng)建腳本

創(chuàng)建腳本主要就是目錄的創(chuàng)建與文件的寫(xiě)入,其中可能需要注意的可能就是格式問(wèn)題。

一種方式是在``之間,按照規(guī)范格式去完成寫(xiě)入內(nèi)容,這樣做比較麻煩,而且可能面臨格式化要求修改問(wèn)題。

另一種方式是在腳本中引入eslint,腳本中的eslint.CLIEngine可以根據(jù)配置文件(比如.eslintrc.js)格式化文件。需要注意的是需要比命令行中配置需要多添加fix: true配置, 如下

const CLIEngine = eslint.CLIEngine;
const cli = new CLIEngine({ ...require("../.eslintrc.js"), fix: true });

eslint在腳本中的使用方法,更具體的可以參考eslint文檔中Node.js API部分。

// scripts/new.js部分
...

components.push({
 label: newName,
 name: newName
})

const updateConfig = function(path, components) {
 writeFile(path, `module.exports = ${JSON.stringify(components)}`).then(() => {
  console.log("完成components.js")
  // 格式化
  CLIEngine.outputFixes(cli.executeOnFiles([configPath]))
 })
}

const createPackages = function(componentName) {
 try {
  const dir = path.resolve(__dirname, `../packages/${componentName}/`)
  // 創(chuàng)建文件夾
  if (!fs.existsSync(dir)) {
   fs.mkdirSync(dir)
   console.log(`完成創(chuàng)建packages/${componentName}文件夾`)
  }
  // 寫(xiě)入README
  if (!fs.existsSync(`${dir}/README.md`)) {
   writeFile(
    `${dir}/README.md`,
    `## ${componentName}
 
 ### 使用說(shuō)明
      `
   ).then(() => {
    console.log("完成創(chuàng)建README")
   })
  }
  // 寫(xiě)入package.json
  if (!fs.existsSync(`${dir}/package.json`)) {
   writeFile(
    `${dir}/package.json`,
    `{
 "name": "@hy/${componentName}",
 "version": "1.0.0",
 "description": "${componentName}",
 "main": "./dist/hy-${componentName}.umd.min.js",
 "keywords": [
  "${componentName}",
  "vue"
 ],
 "author": "",
 "license": "ISC"
}
    `
   ).then(() => {
    console.log("完成創(chuàng)建package.json")
   })
  }
  // 創(chuàng)建index.js
  if (!fs.existsSync(`${dir}/index.js`)) {
   writeFile(`${dir}/index.js`, `export {}`).then(() => {
    console.log("完成創(chuàng)建index.js")
    CLIEngine.outputFixes(cli.executeOnFiles([`${dir}/index.js`]))
   })
  }
 } catch (err) {
  console.error(err)
 }
}

const createExample = function(componentName) {
 try {
  const dir = path.resolve(__dirname, `../examples/${componentName}/`)
  // 創(chuàng)建文件夾
  if (!fs.existsSync(dir)) {
   fs.mkdirSync(dir)
   console.log(`完成創(chuàng)建examples/${componentName}文件夾`)
  }
  // 寫(xiě)入index.vue
  if (!fs.existsSync(`${dir}/index.vue`)) {
   writeFile(
    `${dir}/index.vue`,
    `<template>

</template>

<script>
import { } from '../../packages/${componentName}/index'

export default {
 components: {}
}

</script>
   `
   ).then(() => {
    console.log(`完成創(chuàng)建examples/${componentName}/index.vue文件`)
    // 格式化index.vue
    CLIEngine.outputFixes(cli.executeOnFiles([`${dir}/index.vue`]))
   })
  }
 } catch (err) {
  console.error(err)
 }
}

...

構(gòu)建腳本

// build.js
...

async function build() {
 for (let i = 0, len = components.length; i < len; i++) {
  const name = components[i].name
  await buildService.run(
   "build",
   {
    _: ["build", `${root}/packages/${name}/src/index.js`],
    target: "lib",
    name: `hy-${name}`,
    dest: `${root}/packages/${name}/dist`,
    // 生成格式: umd格式會(huì)同時(shí)成功demo.html commonjs,umd,umd-min
    formats: "commonjs,umd-min"
    // clean: false
   },
   ["--target=all", `./packages/${name}/src/index.js`]
  )
 }
}

...

Lerna

lerna是一個(gè)多包倉(cāng)庫(kù)管理的工具,可以幫助創(chuàng)建、管理、發(fā)布多包倉(cāng)庫(kù)中的包。

關(guān)于lerna我也沒(méi)有太深入得使用,只是用到了發(fā)布。首先在項(xiàng)目下執(zhí)行init初始化了項(xiàng)目,在每次commit之后,可以執(zhí)行publish。lerna會(huì)對(duì)應(yīng)代碼庫(kù)打tag,并發(fā)布到npm倉(cāng)庫(kù)。

項(xiàng)目版本問(wèn)題

0.0.1為不規(guī)范版本號(hào),最小應(yīng)該從1.0.0開(kāi)始。npm publish無(wú)法發(fā)布,但是lerna publish可以發(fā)布。

導(dǎo)致結(jié)果安裝為固定版本號(hào),而不是以^開(kāi)頭的版本號(hào)范圍。outdate可以檢測(cè)到有更新,無(wú)法通過(guò)update升級(jí)。

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

組件開(kāi)發(fā)主要是在packages/<component name>/src目錄下進(jìn)行,在example/<component name>/目錄下可以引入該組件src下的源文件,用一些數(shù)據(jù)來(lái)進(jìn)行開(kāi)發(fā)測(cè)試。組件開(kāi)發(fā)和項(xiàng)目中的組件開(kāi)發(fā)基本相同。

作為組件庫(kù)中的組件,需要更多的考慮其通用性和易用性。不能為了通用而加入很多的屬性,而使其失去易用性;同樣也不能為了易用,而使其過(guò)于簡(jiǎn)單,使用范圍過(guò)于局限。

對(duì)于每一個(gè)屬性、每個(gè)拋出去的方法,都需要認(rèn)真考慮其必要性。

唯一不同的地方可能需要注意的是導(dǎo)出的方式。

一種是直接導(dǎo)出組件,這種形式在使用時(shí)需要引入,并且在components中聲明,也就是局部注冊(cè)。

另一種是添加install方法后導(dǎo)出。這種形式需要調(diào)用vue.use方法,相當(dāng)于全局注冊(cè)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue-router項(xiàng)目實(shí)戰(zhàn)總結(jié)篇

    vue-router項(xiàng)目實(shí)戰(zhàn)總結(jié)篇

    vue-router 是 Vue.js 官方的路由庫(kù).這篇文章主要介紹了vue-router項(xiàng)目實(shí)戰(zhàn)總結(jié),需要的朋友可以參考下
    2018-02-02
  • 一文帶你了解Vue中的axios和proxy代理

    一文帶你了解Vue中的axios和proxy代理

    這篇文章主要為大家詳細(xì)介紹了Vue中的axios和proxy代理的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-03-03
  • 源碼分析Vue3響應(yīng)式核心之effect

    源碼分析Vue3響應(yīng)式核心之effect

    這篇文章主要為大家詳細(xì)介紹了Vue3響應(yīng)式核心之effect的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Vue3有一定的幫助,需要的可以參考一下
    2023-04-04
  • vue3中使用keepAlive緩存路由組件不生效的問(wèn)題解決

    vue3中使用keepAlive緩存路由組件不生效的問(wèn)題解決

    這篇文章主要介紹了vue3中使用keepAlive緩存路由組件不生效的問(wèn)題解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-06-06
  • 淺談ElementUI中switch回調(diào)函數(shù)change的參數(shù)問(wèn)題

    淺談ElementUI中switch回調(diào)函數(shù)change的參數(shù)問(wèn)題

    今天小編就為大家分享一篇淺談ElementUI中switch回調(diào)函數(shù)change的參數(shù)問(wèn)題,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • vue跨域proxy代理配置詳解

    vue跨域proxy代理配置詳解

    今天被vue中proxy配置困擾了一天,記錄一下,下面這篇文章主要給大家介紹了關(guān)于Vue配置文件中的proxy配置方式的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • vue 避免變量賦值后雙向綁定的操作

    vue 避免變量賦值后雙向綁定的操作

    這篇文章主要介紹了vue 避免變量賦值后雙向綁定的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • 在Vue3中使用vue3-print-nb實(shí)現(xiàn)前端打印功能

    在Vue3中使用vue3-print-nb實(shí)現(xiàn)前端打印功能

    在前端開(kāi)發(fā)中,經(jīng)常需要打印頁(yè)面的特定部分,比如客戶列表或商品詳情頁(yè),要快速實(shí)現(xiàn)這些功能,可以使用 vue3-print-nb 插件,本文就給大家介紹了如何在 Vue 3 中使用 vue3-print-nb 實(shí)現(xiàn)靈活的前端打印,需要的朋友可以參考下
    2024-06-06
  • 解決vue中reader.onload讀取文件的異步問(wèn)題

    解決vue中reader.onload讀取文件的異步問(wèn)題

    這篇文章主要介紹了解決vue中reader.onload讀取文件的異步問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 詳解Vue computed計(jì)算屬性是什么

    詳解Vue computed計(jì)算屬性是什么

    在vue中,有時(shí)候你需要對(duì)data中的數(shù)據(jù)進(jìn)行處理,或者對(duì)抓取的數(shù)據(jù)進(jìn)行處理之后再掛載呈現(xiàn)到標(biāo)簽中,這時(shí)候你就需要計(jì)算屬性了,當(dāng)然看到這里你可能還是不了解那下面我舉幾個(gè)實(shí)例并附代碼解釋
    2023-03-03

最新評(píng)論

岱山县| 南部县| 常德市| 汤阴县| 枣强县| 兴仁县| 怀集县| 甘泉县| 南丰县| 新蔡县| 腾冲县| 乐昌市| 扎赉特旗| 新乐市| 瓮安县| 盘山县| 北流市| 瓦房店市| 揭西县| 望谟县| 萨嘎县| 兴国县| 新和县| 遂川县| 阜新市| 文登市| 辽阳县| 进贤县| 乐山市| 上思县| 五大连池市| 平阴县| 鞍山市| 仁怀市| 湖州市| 金阳县| 集贤县| 潮安县| 云安县| 儋州市| 普兰县|