rollup 開發(fā)環(huán)境搭建

rollup 開發(fā)環(huán)境搭建

image-20210815222527524

初始化項(xiàng)目使用lerna管理項(xiàng)目

使用npm init 初始化項(xiàng)目

npm init -y 

安裝lerna并初始化項(xiàng)目

npm install lerna --save-dev
# npx 使用node_modules 中的包
npx lerna init 

現(xiàn)在已經(jīng)生成了下面目錄結(jié)構(gòu)

two-ui
└───node_modules
└───packages
│       lerna.json
│       package.json

安裝rollup并創(chuàng)建rollup.config.js文件

npm install rollup --save-dev
touch rollup.config.js
# vscode 打開rollup配置文件
code rollup.config.js

安裝下面插件

包名 作用
rollup-plugin-commonjs 將CommonJS模塊轉(zhuǎn)換為ES6
@rollup/plugin-node-resolve 在node_模塊中查找并綁定第三方依賴項(xiàng)
@rollup/plugin-json 將json 文件轉(zhuǎn)換為ES6 模塊
@rollup/plugin-babel rollup babel插件
@babel/core babel核心模塊
@babel/preset-env babel
@babel/preset-typescript babel處理ts
@vue/babel-plugin-jsx 用tsx的方式寫vue
vue vue
rollup-plugin-terser 優(yōu)化代碼
rimraf 刪除工具
@rollup/plugin-replace 替換環(huán)境變量
rollup-plugin-serve 開發(fā)服務(wù)器
rollup-plugin-livereload 熱更新服務(wù)
rollup-plugin-less less
@rollup/plugin-alias 路徑別名
eslint 代碼格式校驗(yàn)
inquirer 命令行交互
cross-env 設(shè)置環(huán)境變量
child_process 創(chuàng)建子線程執(zhí)行命令
plop 根據(jù)模板創(chuàng)建目錄結(jié)構(gòu)
typescript ts模塊

rollup.config.js中寫入以下rollup配置

import path from 'path'
// 將CommonJS模塊轉(zhuǎn)換為ES6
import commonjs from 'rollup-plugin-commonjs'
// 在node_模塊中查找并綁定第三方依賴項(xiàng)
import resolve from '@rollup/plugin-node-resolve'
// 將json 文件轉(zhuǎn)換為ES6 模塊
import json from '@rollup/plugin-json'
// rollup babel插件
import { babel } from '@rollup/plugin-babel'
// 優(yōu)化代碼 
import { terser } from 'rollup-plugin-terser'
// 刪除工具
import rm from 'rimraf'
// 替換環(huán)境變量
import replace from '@rollup/plugin-replace'
// 開發(fā)服務(wù)器
import serve from 'rollup-plugin-serve'
// 熱更新服務(wù)
import livereload from 'rollup-plugin-livereload'
// less 處理
import less from 'rollup-plugin-less'
// 路徑別名
import alias from '@rollup/plugin-alias';


// 獲取入口文件
const input = process.env.INPUT_FILE
// 開發(fā)環(huán)境or生產(chǎn)環(huán)境
const NODE_ENV = process.env.NODE_ENV
// 判斷是是否為生產(chǎn)環(huán)境
const isPro = function () {
  return NODE_ENV === 'production'
}
// 當(dāng)前執(zhí)行命令的路徑
const root = process.cwd()
// 獲取每個(gè)包的package.json 文件
const pkg = require(path.resolve(root, 'package.json'))
// 后綴
const extensions = ['.js', '.jsx', '.ts', '.tsx', '.less']
// 排除的打包 
const external = ['vue']
// 開發(fā)環(huán)境只打包esm
const output = [{
  exports: 'auto',
  file: path.join(root, pkg.module),
  format: 'es',
}]

// 如果是生產(chǎn)環(huán)境
if (isPro()) {
  // 也排出自己寫的包
  external.push(/@two-ui/)
  // 打其他包
  output.push({
    exports: 'auto',
    file: path.resolve(root, pkg.main),
    format: 'cjs'
  })
}

// 刪除dist目錄
rm(path.resolve(root, 'dist'), err => {
  if (err) throw err
})

export default {
  input,
  output,
  external,
  // 監(jiān)聽的文件
  watch: {
    exclude: 'node_modules/**'
  },
  // 不參與打包
  plugins: [
    resolve({
      preferBuiltins: false,
      mainFields: ['module', 'main'],
      extensions
    }),
    less({
      // 開發(fā)模式下才插入到頁面中
      insert:  isPro() ? false: true,
      output: 'dist/style/main.css',
    }),
    babel({
      babelHelpers: 'bundled',
      extensions,
      exclude: [
        '*.config.js',
        'packages/**/node_modules/*.d.ts',
        'node_modules/*.d.ts',
        '**/dist/**/*',
        '**/demo/*'
      ]
    }),
    commonjs(),
    json(),
    // 生產(chǎn)模式則壓縮代碼
    isPro() && terser(),
    // 熱更新
    !isPro() && livereload({
      watch: ['dist', 'demo'],
      verbose: false
    }),
    // 開發(fā)模式替換環(huán)境變量
    !isPro() && replace({
      'process.env.NODE_ENV': JSON.stringify(NODE_ENV),
      "vue": "/vue.esm-browser.js"
    }),
    // 開發(fā)模式開啟靜態(tài)服務(wù)器
    !isPro() &&  serve({
      open: true,
      port: 8080,
      contentBase: [path.resolve(root, 'dist'), path.resolve(root, 'demo'), path.resolve(__dirname, 'node_modules/vue/dist')],
      openPage: 'demo/index.html'
    })
  ]
}

增加啟動(dòng)命令(這是在每個(gè)單獨(dú)的包中的)

{
  "scripts": {
    "build:dev": "cross-env NODE_ENV=development INPUT_FILE=./src/index.ts rollup -c ../../rollup.config.js -w",
    "build:pro": "cross-env NODE_ENV=production INPUT_FILE=./src/index.ts rollup -c ../../rollup.config.js"
  }
}

創(chuàng)建babel.config.json文件并寫入以下配置

{
    "presets": [
        "@babel/preset-env",
        "@babel/preset-typescript"
    ],
    "plugins": [
        "@vue/babel-plugin-jsx"
    ]
}

初始化eslint根據(jù)選項(xiàng)初始化eslint

npx eslint --init

增加格式化命令璃吧,校驗(yàn)格式是否正確與修復(fù)格式

{
  "lint": "eslint ./packages --ext ts --ext tsx",
  "fix": "eslint ./packages --ext ts --ext tsx --fix"
}

創(chuàng)建.eslintignore文件添加忽略需要校驗(yàn)的文件

node_modules
dist
rollup.config.js
packages/**/dist/
packages/**/*.d.ts
*.d.ts
/**/*.d.ts
es
lib

創(chuàng)建plop模板

mkdir plop-template/component
cd plop-template/component

創(chuàng)建一下目錄結(jié)構(gòu)

component
└───demo
│       │    index.hbs
└───src
│       │    component.hbs
│       │    index.hbs
│       babel.config.json
│       LICENSE
│       package.hbs
│       README.hbs

創(chuàng)建plopfile.js配置文件

module.exports = plop => {
  plop.setGenerator('component', {
    description: 'create a custom component',
    prompts: [
      {
        type: 'input',
        name: 'name',
        message: 'component name',
        default: 'MyComponent'
      }
    ],
    actions: [
      {
        type: 'add',
        path: 'packages/{{name}}/src/index.ts',
        templateFile: 'plop-template/component/src/index.hbs'
      },
      {
        type: 'add',
        path: 'packages/{{name}}/demo/index.html',
        templateFile: 'plop-template/component/demo/index.hbs'
      },
      {
        type: 'add',
        path: 'packages/{{name}}/src/{{name}}.tsx',
        templateFile: 'plop-template/component/src/component.hbs'
      },
      {
        type: 'add',
        path: 'packages/{{name}}/babel.config.json',
        templateFile: 'plop-template/component/babel.config.json'
      },
      {
        type: 'add',
        path: 'packages/{{name}}/package.json',
        templateFile: 'plop-template/component/package.hbs'
      },
      {
        type: 'add',
        path: 'packages/{{name}}/LICENSE',
        templateFile: 'plop-template/component/LICENSE'
      },
      {
        type: 'add',
        path: 'packages/{{name}}/README.md',
        templateFile: 'plop-template/component/README.hbs'
      }
    ]
  })
}

倉(cāng)庫(kù)地址https://github.com/kspf/two-ui

原文地址: https://kspf.xyz/archives/141/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末箫锤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腐芍,更是在濱河造成了極大的恐慌辈赋,老刑警劉巖策精,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凯沪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡果录,警方通過查閱死者的電腦和手機(jī)上枕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弱恒,“玉大人辨萍,你說我怎么就攤上這事》档” “怎么了锈玉?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)义起。 經(jīng)常有香客問我拉背,道長(zhǎng),這世上最難降的妖魔是什么并扇? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任去团,我火速辦了婚禮抡诞,結(jié)果婚禮上穷蛹,老公的妹妹穿的比我還像新娘。我一直安慰自己昼汗,他們只是感情好肴熏,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顷窒,像睡著了一般蛙吏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鞋吉,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天鸦做,我揣著相機(jī)與錄音,去河邊找鬼谓着。 笑死泼诱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赊锚。 我是一名探鬼主播治筒,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼屉栓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了耸袜?” 一聲冷哼從身側(cè)響起友多,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堤框,沒想到半個(gè)月后域滥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜈抓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年骗绕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片资昧。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酬土,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出格带,到底是詐尸還是另有隱情撤缴,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布叽唱,位于F島的核電站屈呕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏棺亭。R本人自食惡果不足惜虎眨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镶摘。 院中可真熱鬧嗽桩,春花似錦、人聲如沸凄敢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涝缝。三九已至扑庞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拒逮,已是汗流浹背罐氨。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滩援,地道東北人栅隐。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親约啊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子邑遏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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