Skip to content

虽然 Rollup 对于打包 JS 类库和组件有针对性的优势,但它也支持项目层面的打包配置。

社区提供了大量的插件,来丰富 Rollup 的功能。

但是相比 GulpWebpack 来说,Rollup 在项目层面的打包,优势不大。

因此本节内容,作为了解即可。实际项目开发中,不建议单方面的应用 Rollup

同大多数打包工具类似,在配置中,也将项目划分为开发环境生产环境

js
const getBaseConfig = require('./config/index.js')
const generateHtmlConfig = require('./config/generateHtml.js')

const serve = require('rollup-plugin-serve')
const livereload = require('rollup-plugin-livereload')
const { terser } = require('rollup-plugin-terser')
const postcss = require('rollup-plugin-postcss')
const html = require('@rollup/plugin-html')
const copy = require('rollup-plugin-copy')

module.exports = (args) => {
  const format = 'umd'
  const baseConfig = getBaseConfig({ format })
  const { environment } = args
  const plugins = environment ? [
    copy({
      targets: [{
        src: 'lib/',
        dest: 'dist/'
      }]
    }),
    html(generateHtmlConfig(format))
  ] : []
  if (environment === 'PROD') {
    plugins.push(
      postcss({
        extract: true
      }),
      terser()
    )
  } else if (environment === 'DEV') {
    plugins.push(
      postcss({
        extract: false
      }),
      serve({
        host: '10.0.41.35',
        port: 10001,
        contentBase: 'dist'
      }),
      livereload({
        delay: 300
      })
    )
  }
  baseConfig.plugins.push(...plugins)
  return baseConfig
}

另外,也可以自定义 HTML 模板,这里采用了 @rollup/plugin-html 插件:

js
module.exports = (format) => {
  return {
    title: 'Hello Rollup',
    template: ({ bundle, files, publicPath, title }) => {
      const getScriptDom = ({ publicPath, file }) => {
        return format === 'es' ? `<script type="module" src="${publicPath}${file.fileName}"></script>` : `<script src="${publicPath}${file.fileName}"></script>`
      }
      const script = files.js ? files.js.map(file => getScriptDom({ publicPath, file })).join('\n') : ''
      const styles = files.css ? files.css.map(file => `<link rel="stylesheet" href="${publicPath}${file.fileName}">`).join('\n') : ''
      return `<!DOCTYPE html>
        <html>
          <head>
            <title>${title}</title>
            ${styles}
          </head>
          <body>
            <div id="app">
              <p class="title"></p>
              <p id="time-now"></p>
            </div>
            <script src="./lib/jquery-3.6.4.min.js"></script>
            ${script}
          </body>
        </html>
      `
    }
  }
}