我可以使用 Rollup 和 Gulp 有多个入口点吗?

vel*_*ian 6 gulp rollupjs

我有一个gulpfile.js使用 Rollup 来构建两个不同的 JS 文件(前端和管理)。该rollup.config.js方法允许指定多个入口点和包,但要使用 Gulp 实现这一点,我不得不做一些令人讨厌的解决方法。

const javascripts = [
  {
    src: './app/assets/javascripts/main.js',
    dest: './public/javascripts/main.js',
    moduleName: 'main'
  },
  {
    src: './admin/assets/javascripts/admin.js',
    dest: './public/admin/javascripts/admin.js',
    moduleName: 'admin'
  }
]

gulp.task('js:compile', ()=> {
  javascripts.forEach((item)=> {
    return rollup({
      input: item.src,
      plugins: [
        builtins(),
        nodeResolve({ jsnext: true, browser: true }),
        commonjs({
          include: 'node_modules/**',
          exclude: 'node_modules/rollup-plugin-node-globals/**',
          ignoreGlobal: false,
          sourceMap: true,
          main: true,
          browser: true
        }),
        json(),
        buble()
      ]
    }).then(function (bundle) {
      return bundle.write({
        format: 'iife',
        name: item.moduleName,
        file: item.dest
      })
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现这一目标?我不反对重新组织我的文件以使用 globbing 或类似的东西。

编辑:我已经将它更新为使用 Node 的,fs而不必指定每个脚本,但这对我来说仍然感觉有点笨拙。

gulp.task('js:compile', () => {
  fs.readdir('./app/assets/javascripts', (err, files) => {
    if(err) throw err

    files.forEach((file) => {
      if(!file.match('.js')) return false

      return rollup({
        input: `./app/assets/javascripts/${file}`,
        plugins: [
          builtins(),
          nodeResolve({ jsnext: true, browser: true }),
          commonjs({
            include: 'node_modules/**',
            exclude: 'node_modules/rollup-plugin-node-globals/**',
            ignoreGlobal: false,
            sourceMap: true,
            main: true,
            browser: true
          }),
          json(),
          buble()
        ]
      }).then((bundle) => {
        return bundle.write({
          format: 'iife',
          name: file.split('.')[-2],
          file: `./public/javascripts/${file}`
        })
      }).catch( (e) => console.log(e) )
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

Din*_*eic 22

现在,您只需从rollup.config.js.

所以如果你

  • 需要编译单个文件,返回对象 export default {...}
  • 需要编译多个文件,返回对象列表export default [{...},{...},{...}, ...]

在这里寻找灵感


小智 5

您现在可以使用https://github.com/alfredosalzillo/rollup-plugin-multi-input,它还可以在输出目录中保留目录树。

import multiInput from 'rollup-plugin-multi-input';

export default {
    input: ['src/**/*.js'],
    experimentalCodeSplitting: true,
    output: {
      format: 'esm',
      dir: 'dist'
    },
    plugins: [ multiInput() ],
};
Run Code Online (Sandbox Code Playgroud)

  • 这不再需要了,您只需返回`export default [{..}, {...}]` 的对象列表 (5认同)