從0搭建rollup+vue組件模板捉蚤,輕松發(fā)布npm汽纠、githubpages

最近更新模板

vue-cli3攜手rollup卫键、github-actions打造自動(dòng)部署的vue組件模板(使用篇) 2020-01-08

前言

既然是rollup+vue組件模板,就不說(shuō)明為什么采用這個(gè)模式來(lái)開(kāi)發(fā)組件了虱朵。
需要了解rollup的看文檔:rollup官方文檔
本文目標(biāo)是搭建一個(gè)簡(jiǎn)單實(shí)用的rollup+vue組件開(kāi)發(fā)模板莉炉。

rollup打包

找個(gè)文件夾,開(kāi)干

mkdir vue-rollup-component-template
cd vue-rollup-component-template
npm init

安裝 rollup

npm i -D rollup

配置文件 rollup.config.js

export default {
  input: 'src/index.js',
  output: {
    name: 'vue-rollup-component-template',
    file: 'dist/vue-rollup-component-template.js',
    format: 'umd'
  }
}

入口文件 src/index.js

const x = 1;

export default (y) => x + y

修改 package.json 命令

"scripts": {
    "build": "rollup --config rollup.config.js"
}

打包

npm run build

完成了一個(gè)簡(jiǎn)單的打包碴犬。

不同打包格式與命令

image
"scripts": {
    "build": "npm run build:browser && npm run build:es && npm run build:umd",
    "build:browser": "rollup --config build/rollup.config.browser.js",
    "build:es": "rollup --config build/rollup.config.es.js",
    "build:umd": "rollup --config build/rollup.config.umd.js"
},

通用配置 build/rollup.config.base.js

export default {
  input: 'src/index.js',  //入口
  plugins: [] // 插件
}
  • es – ES模塊文件絮宁。

安裝js壓縮插件

npm i -D rollup-plugin-uglify-es

build/rollup.config.es.js

import base from './rollup.config.base'
import uglify from 'rollup-plugin-uglify-es' //js壓縮

const config = Object.assign({}, base, {
  output: {
    exports: 'named',
    name: 'vue-rollup-component-template',
    file: 'dist/vue-rollup-component-template.min.js',
    format: 'iife'
  },
})

config.plugins.push(uglify())

export default config
  • umd – 通用模塊定義,以amd服协,cjs 和 iife 為一體绍昂。

build/rollup.config.browser.js

import base from './rollup.config.base'

const config = Object.assign({}, base, {
  output: {
    exports: 'named',
    name: 'vue-rollup-component-template',
    file: 'dist/vue-rollup-component-template.umd.js',
    format: 'umd'
  },
})

export default config

  • iife – 一個(gè)自動(dòng)執(zhí)行的功能,適合作為< script >標(biāo)簽偿荷。

build/rollup.config.browser.js

import base from './rollup.config.base'
import uglify from 'rollup-plugin-uglify-es' //js壓縮

const config = Object.assign({}, base, {
  output: {
    exports: 'named',
    name: 'VueRollupComponentTemplate',
    file: 'dist/vue-rollup-component-template.min.js',
    format: 'iife'
  },
})

config.plugins.push(uglify())

export default config

打包

npm run build
image

安裝插件

組件開(kāi)發(fā)少不了引入模塊窘游、es6等,需要用 插件(plugins) 在打包的關(guān)鍵過(guò)程中更改 Rollup 的行為跳纳。

npm i -D rollup-plugin-node-resolve rollup-plugin-commonjs
npm i -D  rollup-plugin-vue vue vue-template-compiler

修改build/rollup.config.base.js

import resolve from 'rollup-plugin-node-resolve' // 告訴 Rollup 如何查找外部模塊
import commonjs from 'rollup-plugin-commonjs' // 將CommonJS模塊轉(zhuǎn)換為 ES2015 供 Rollup 處理
import vue from 'rollup-plugin-vue' // 處理vue文件
import babel from 'rollup-plugin-babel'  // rollup 的 babel 插件忍饰,ES6轉(zhuǎn)ES5

export default {
  input: 'src/index.js',
  plugins: [
    resolve({ extensions: ['.vue'] }),
    commonjs(),
    vue(),
    babel()
  ]
}

rollup-plugin-babel 插件需要 babel 支持

npm i -D babel-core babel-preset-env babel-preset-stage-3 rollup-plugin-babel@3.0.0

新建 .babelrc

{
  "presets": [
    ["env", { "modules": false }],
    "stage-3"
  ],
}

組件開(kāi)發(fā)與root設(shè)置

image

設(shè)置 root

npm i -D babel-plugin-module-resolver

.babelrc 增加 plugins

{
  "plugins": [
    [
      "module-resolver",
      {
        "root": ["src/"]
      }
    ]
  ]
}

從而src目錄下的模塊引入,不需要'../../'寺庄,只要 (年齡小的艾蓝、身材好的)

import VList from 'components/list'
import util from 'utils/util'
import mixins from 'mixins/mixin'
...

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

src/components/list/main.vue

<template>
  <div class="v-list">
    <slot/>
    <div class="v-list-date">
      <div class="v-list-date-label">當(dāng)前時(shí)間:</div>
      <div class="v-list-date-text">{{date}}</div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'VList',
  data() {
    return {
      date: new Date()
    }
  }
}
</script>

src/components/list/index.js

import Main from './main';
export default Main

src/index.js

import VList from 'components/list';

const components = [VList]

const install = function (Vue) {
  components.forEach(component => {
    Vue.component(component.name, component)
  })
}

// 自動(dòng)注冊(cè)組件
if (typeof window !== 'undefined' && window.Vue) {
  install(window.Vue);
}

export default install

css打包壓縮

npm i -D rollup-plugin-css-only  clean-css

build/rollup.config.base.js 增加

...
import css from 'rollup-plugin-css-only' // 提取css力崇,壓縮能力不行
import CleanCSS from 'clean-css' // 壓縮css
import { writeFileSync } from 'fs' // 寫(xiě)文件

export default {
  input: 'src/index.js',
  plugins: [
    ...
    css({ output(style) {
      // 壓縮 css 寫(xiě)入 dist/vue-rollup-component-template.css
      writeFileSync('dist/vue-rollup-component-template.css', new CleanCSS().minify(style).styles)
    } }),
    // css: false 將<style>塊轉(zhuǎn)換為導(dǎo)入語(yǔ)句,rollup-plugin-css-only可以提取.vue文件中的樣式
    vue({ css: false }), 
    ...
  ]
}

rollup-plugin-css-only 支持 css及scss

src/components/list/main.vue

<style>
.v-list {
  width: 300px;
  margin: 0 auto;
}
</style>

<style lang="scss">
.v-list-date {
  display: flex;
  justify-content: center;
  align-items: center;
  margin-top: 30px;
  .v-list-date-label{
    font-size: 12px;
    color: #999;
  }
  .v-list-date-text{
    font-size: 12px;
    color: #666;
  }
}
</style>

<style scoped>
.v-list-1 {
  background-color: #333;
}
</style>
image

看起來(lái)一切順利就可以打包發(fā)布npm了赢织。

可能發(fā)了一堆bug到npm...亮靴,還沒(méi)測(cè)試呢。

測(cè)試與docs

創(chuàng)建docs

其實(shí)就是 vue 的簡(jiǎn)易模板

vue init webpack-simple docs
image

安裝依賴(lài)

cd docs
npm i

docs/src/main.js 引入于置、注冊(cè)組件及css

...
import VueRollupComponentTemplate from '../../'
import '../../dist/vue-rollup-component-template.css'

Vue.use(VueRollupComponent)
...

docs/src/app.vue 使用組件

<template>
  <div id="app">
    <h1>vue-rollup-component-template</h1>
    <p>輕松進(jìn)行組件開(kāi)發(fā)茧吊、發(fā)布、展示</p>
    <v-list></v-list>
  </div>
</template>

docs/index.html js引入路徑改為相對(duì)路徑(加個(gè)點(diǎn))

<script src="./dist/build.js"></script>

docs/.gitignore 把dist/忽略去掉俱两,github展示頁(yè)面需要訪問(wèn)dist/

...
dist/ 去掉這個(gè)
...

docs目錄下只用改這幾個(gè)地方就可以

準(zhǔn)備測(cè)試

根目錄下

npm i -D cross-env

package.json 添加命令

"scripts": {
    ...
    "dev": "cross-env NODE_ENV=development rollup --config build/rollup.config.es.js --watch"
},

package.json 修改/添加程序入口

...
"main": "dist/vue-rollup-component-template.umd.js",
"module": "dist/vue-rollup-component-template.esm.js",
"unpkg": "dist/vue-rollup-component-template.min.js",
...

開(kāi)始測(cè)試

  • 根目錄下
npm run dev
  • docs目錄下
npm run dev

根目錄src下內(nèi)容修改會(huì)重新打包到dist饱狂,docs目錄監(jiān)聽(tīng)到dist目錄變動(dòng)會(huì)實(shí)時(shí)響應(yīng)并刷新頁(yè)面曹步。

測(cè)試過(guò)后沒(méi)問(wèn)題就可以打包項(xiàng)目宪彩,登錄npm發(fā)布組件了。

發(fā)布npm與githubpages

組件與測(cè)試是獨(dú)立的讲婚。

  • 根目錄下打包的組件可以直接發(fā)布npm尿孔,不用考慮測(cè)試生產(chǎn)環(huán)境,從而專(zhuān)注組件開(kāi)發(fā)筹麸。
  • docs錄下活合,在提交github之前打包,然后整個(gè)項(xiàng)目上傳github物赶。

發(fā)布npm

新建 .npmignore 文件白指,添加 npm 忽略文件

docs/
.babelrc

登錄npm,然后發(fā)布

npm publish

githubpages

新建 .gitignore 文件酵紫,添加 git 忽略文件

.DS_Store
node_modules/
.vscode/
npm-debug.log
yarn-error.log

然后上傳到github告嘲,打開(kāi)項(xiàng)目設(shè)置,github pages的surce項(xiàng)選擇docs奖地。

image
image

打開(kāi)分配的地址就可以觀光頁(yè)面了橄唬。

image

項(xiàng)目 github 地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市参歹,隨后出現(xiàn)的幾起案子仰楚,更是在濱河造成了極大的恐慌,老刑警劉巖犬庇,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僧界,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡臭挽,警方通過(guò)查閱死者的電腦和手機(jī)捂襟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)埋哟,“玉大人笆豁,你說(shuō)我怎么就攤上這事郎汪。” “怎么了闯狱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵煞赢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我哄孤,道長(zhǎng)照筑,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任瘦陈,我火速辦了婚禮凝危,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晨逝。我一直安慰自己蛾默,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布捉貌。 她就那樣靜靜地躺著支鸡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪趁窃。 梳的紋絲不亂的頭發(fā)上牧挣,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音醒陆,去河邊找鬼瀑构。 笑死,一個(gè)胖子當(dāng)著我的面吹牛刨摩,可吹牛的內(nèi)容都是我干的寺晌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼码邻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼折剃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起像屋,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怕犁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后己莺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奏甫,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年凌受,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阵子。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胜蛉,死狀恐怖挠进,靈堂內(nèi)的尸體忽然破棺而出色乾,到底是詐尸還是另有隱情,我是刑警寧澤领突,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布暖璧,位于F島的核電站,受9級(jí)特大地震影響君旦,放射性物質(zhì)發(fā)生泄漏澎办。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一金砍、第九天 我趴在偏房一處隱蔽的房頂上張望局蚀。 院中可真熱鬧,春花似錦恕稠、人聲如沸琅绅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奉件。三九已至宵蛀,卻和暖如春昆著,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背术陶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工凑懂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梧宫。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓接谨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親塘匣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脓豪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 認(rèn)識(shí)rolloup 根據(jù)官網(wǎng)的介紹,rollup是一個(gè)用于打包代碼的庫(kù)忌卤,其作用類(lèi)似于webpack扫夜。但優(yōu)勢(shì)是配置非...
    長(zhǎng)肉肉呱閱讀 5,228評(píng)論 1 4
  • 最近感覺(jué)自己越來(lái)越像一個(gè)API調(diào)用程序員,很多基礎(chǔ)的原理以及項(xiàng)目構(gòu)建都沒(méi)實(shí)際操作過(guò)驰徊,所以這里動(dòng)手自己去搭建了一個(gè)v...
    Aoyi_G閱讀 1,504評(píng)論 0 2
  • 在分析Vue的源碼之前我們需要了解一些前置知識(shí)笤闯,如Flow、源碼目錄棍厂、構(gòu)建方式颗味、編譯入口等。 認(rèn)識(shí) Flow Fl...
    oWSQo閱讀 1,086評(píng)論 1 2
  • 確認(rèn)過(guò)眼神牺弹,你還是沒(méi)有準(zhǔn)備秋招的人浦马?時(shí)間倉(cāng)促时呀。自京東6月8號(hào)開(kāi)啟管培生的招聘,就意味著秋招的開(kāi)始晶默。然而你還在等著秋...
    千鋒H5閱讀 1,816評(píng)論 1 13
  • 渡人退唠,是向外施善,是品德的外化——示柔以化人荤胁; 渡己瞧预,是向內(nèi)反省,是改過(guò)的修行——用剛以律己仅政。 二者一內(nèi)一外垢油,一方...
    張三峽閱讀 383評(píng)論 0 4