# Vue使用Rollup編寫tsx組件庫

Vue使用Rollup編寫tsx組件庫

注意

這套配置方案遇到個問題:在我的家庭版 win10 系統(tǒng)中,rollup build 打包會報錯 can not resolve xxx筐付, 即無法解析 import 路徑的問題,但是我嘗試過沮尿,在我的專業(yè)版win10系統(tǒng)中沒有問題,還有在 Ubuntu 系統(tǒng)中也沒有問題赴邻;
這個問題很奇怪啡捶,似乎 rollup 對家庭版 win10 并不兼容,所以建議各位系統(tǒng)盡量使用專業(yè)版的windows系統(tǒng)

感謝以下資料

步驟

  • 安裝環(huán)境

安裝以下3個輔助庫彤敛,這便是關鍵墨榄,缺一不可勿她,否則無法實現(xiàn)用 class 編寫 tsx 的 vue 組件

yarn add vue-class-component -D
yarn add vue-property-decorator -D
yarn add vue-tsx-support -D

安裝 sass 庫(樣式庫看個人喜好,選擇 less 還是 sass 無所謂)

yarn add node-sass -D
yarn add sass-loader -D

安裝其他輔助庫(主要參考下面給出的 package.json 腳本中的依賴即可之剧,缺什么加什么)

yarn add -D rollup-plugin-typescript2
yarn add -D rollup-plugin-peer-deps-external
yarn add -D rollup-plugin-scss
...
  • 創(chuàng)建 rollup 倉庫
    臨時使用 rollup 針對 vue 的腳手架猪狈,快速創(chuàng)建 vue 的 rollup 組件庫工程
    在 vue-sfc-rollup 的步驟提示中辩恼,一定記得選擇 typescript
    npx vue-sfc-rollup

  • 在 entry.ts 中 import ts檢查腳本

import "vue-tsx-support/enable-check";
  • 我的 package.json 中的所有依賴,請按照我的配置疆前,有些依賴一定要放到 peerDependencies 讓 rollup 作為外部依賴進行打包處理
{
  "name": "mq-components",
  "version": "1.0.0",
  "description": "",
  "main": "dist/mq-components.ssr.js",
  "browser": "dist/mq-components.esm.js",
  "module": "dist/mq-components.esm.js",
  "unpkg": "dist/mq-components.min.js",
  "types": "mq-components.d.ts",
  "files": [
    "dist/*",
    "mq-components.d.ts",
    "src/**/*.tsx"
  ],
  "scripts": {
    "serve": "vue-cli-service serve dev/serve.ts",
    "build": "cross-env NODE_ENV=production TARGET=web-standalone-dev rollup --config build/rollup.config.js",
    "build:ssr": "cross-env NODE_ENV=production rollup --config build/rollup.config.js --format cjs",
    "build:es": "cross-env NODE_ENV=production rollup --config build/rollup.config.js --format es",
    "build:unpkg": "cross-env NODE_ENV=production rollup --config build/rollup.config.js --format iife"
  },
  "devDependencies": {
    "@babel/core": "^7.9.0",
    "@babel/preset-env": "^7.9.5",
    "@babel/preset-typescript": "^7.9.0",
    "@rollup/plugin-alias": "^2.2.0",
    "@rollup/plugin-commonjs": "^11.1.0",
    "@rollup/plugin-node-resolve": "^9.0.0",
    "@rollup/plugin-replace": "^2.3.2",
    "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
    "@vue/babel-preset-jsx": "^1.2.2",
    "@vue/cli-plugin-babel": "^4.3.1",
    "@vue/cli-plugin-typescript": "^4.3.1",
    "@vue/cli-service": "^4.3.1",
    "cross-env": "^7.0.2",
    "minimist": "^1.2.5",
    "node-sass": "^4.14.1",
    "rollup": "^2.7.3",
    "rollup-plugin-babel": "^4.4.0",
    "rollup-plugin-peer-deps-external": "^2.2.3",
    "rollup-plugin-scss": "^2.6.1",
    "rollup-plugin-terser": "^5.3.0",
    "rollup-plugin-typescript2": "^0.28.0",
    "rollup-plugin-vue": "^5.1.6",
    "sass-loader": "^10.0.3",
    "typescript": "^3.8.3",
    "vue": "^2.6.11",
    "vue-class-component": "^7.2.6",
    "vue-property-decorator": "^9.0.2",
    "vue-template-compiler": "^2.6.11",
    "vue-tsx-support": "^2.3.3"
  },
  "peerDependencies": {
    "element-ui": "^2.13.2",
    "vue": "^2.6.11",
    "vue-tsx-support": "^3.0.2"
  },
  "engines": {
    "node": ">=10"
  }
}
  • 刪除根目錄下的 shims-tsx.d.ts ,否則會報重復定義的錯誤

  • vue-src-rollup 自動生成的 rollup.config.js 腳本中的代碼都刪除米辐,然后寫入我下面的配置腳本

// rollup.config.js
// 下面 import 的一些庫,這里沒用到赊窥,是原來 vue-sfc-rollup 自動生成的狸页,
// 我沒刪除,是因為后續(xù)優(yōu)化可能會用到址遇,作為提醒自己,以免忘記
import fs from 'fs'
import path from 'path'
import vue from 'rollup-plugin-vue'
import external from 'rollup-plugin-peer-deps-external'
import typescript from 'rollup-plugin-typescript2'
import scss from 'rollup-plugin-scss'
import alias from '@rollup/plugin-alias'
import commonjs from '@rollup/plugin-commonjs'
import replace from '@rollup/plugin-replace'
import resolve from '@rollup/plugin-node-resolve'
import babel from 'rollup-plugin-babel'
import { terser } from 'rollup-plugin-terser'
import minimist from 'minimist'

const projectRoot = path.resolve(__dirname, '..')
const argv = minimist(process.argv.slice(2))

const globals = {
  vue: "Vue" // 告訴rollup全局變量Vue即是vue
}

const ourPutDir = 'lib'
// default
let output = {
  dir: ourPutDir,
  format: 'es',
  globals
}
// console.log(" argv.format = ",argv.format)
if (argv.format && argv.format === 'es') {
  console.log(" es argv.format = ", argv.format);
  output = {
    dir: ourPutDir,
    format: 'esm',
    exports: 'named',
  }
} else if (argv.format && argv.format === 'cjs') {
  console.log(" cjs argv.format = ", argv.format);
  output = {
    compact: true,
    dir: ourPutDir,
    format: 'cjs',
    name: 'MqComponents',
    exports: 'named',
    globals,
  }
} else if (argv.format && argv.format === 'iife') {
  console.log(" iife argv.format = ", argv.format)
  output = {
    compact: true,
    dir: ourPutDir,
    format: 'iife',
    name: 'MqComponents',
    exports: 'named',
    globals,
  }
}

export default {
  input: 'src/index.ts',
  output,
  plugins: [
    external(),
    alias({
      resolve: ['.js', '.jsx', '.ts', '.tsx'],
      entries: {
        '@': path.resolve(projectRoot, 'src'),
      },
    }),
    scss({
      output: path.resolve(projectRoot, ourPutDir + '/main.css'),
    }),
    typescript(),
    resolve({
      extensions: ['.ts', '.tsx', '.js', '.jsx']
    }),
    commonjs(),
    babel({
      exclude: 'node_modules/**',
      extensions: ['.js', '.jsx', '.ts', '.tsx'],
      presets: ["@vue/babel-preset-jsx"]
    }),
  ]
}
  • 最后可以在 src 下面編寫自己的 tsx 腳本了,下面給出一份案例

【src/lib-components/template-sample/style.scss】

.container {
    background-color: red;
}

【src/lib-components/template-sample/index.tsx】

import { Component } from 'vue-property-decorator';
import {
    Component as TsComponent
} from "vue-tsx-support";
import './style.scss';

export interface ITemplateSampleProps{

}

@Component
export default class TemplateSample extends TsComponent<ITemplateSampleProps>{

    protected render(){
        return (<div class="container">hello every one</div>)
    }
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末复濒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子畦木,更是在濱河造成了極大的恐慌,老刑警劉巖蛆封,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惨篱,死亡現(xiàn)場離奇詭異,居然都是意外死亡砸讳,警方通過查閱死者的電腦和手機界牡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門宿亡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挽荠,你說我怎么就攤上這事∧恚” “怎么了臭脓?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窘奏。 經(jīng)常有香客問我葫录,道長,這世上最難降的妖魔是什么米同? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任面粮,我火速辦了婚禮,結果婚禮上熬苍,老公的妹妹穿的比我還像新娘。我一直安慰自己婿脸,他們只是感情好,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布狐树。 她就那樣靜靜地躺著鸿脓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪味赃。 梳的紋絲不亂的頭發(fā)上虐拓,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音蓉驹,去河邊找鬼。 笑死狠持,一個胖子當著我的面吹牛瞻润,可吹牛的內(nèi)容都是我干的甜刻。 我是一名探鬼主播正勒,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祥绞!你這毒婦竟也來了鸭限?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤兜喻,失蹤者是張志新(化名)和其女友劉穎赡麦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隧甚,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡戚扳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年帽借,在試婚紗的時候發(fā)現(xiàn)自己被綠了超歌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡脆荷,死狀恐怖懊悯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炭分,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布观堂,位于F島的核電站,受9級特大地震影響师痕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜七兜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一腕铸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虽界,春花似錦、人聲如沸涛菠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琅关。三九已至,卻和暖如春讥蔽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背新症。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工徒爹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人金抡。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像榛瓮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子禀晓,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348