使用 Vite 将 JS 和 CSS 捆绑到单个文件中

rin*_*ter 33 javascript css bundle svelte vite

我正在费尽心思地弄清楚如何在我的 Svelte 项目中从 Vite 构建单个 .js 文件,其中包括我的 Svelte 项目中构建的所有 javascript 和 CSS。默认情况下,Vite 将应用程序捆绑到一个 html 文件(这可以)、两个 .js 文件(为什么?)和一个 .css 文件(只想将其捆绑到一个 js 文件中)。

我运行了这个非常基本的命令来获取入门项目:
npx degit sveltejs/template myproject

我尝试添加几个插件,但我添加的任何一个都没有达到我想要的结果。首先,我发现的插件似乎想要创建一个包含所有内容的 HTML 文件。看起来 PostCSS 可能会有所帮助,但我不明白我可以通过 Vite 设置什么配置来让它执行我想要的操作。

什么是神奇的插件和配置集,它将输出单个 HTML 文件和单个 js 文件,将我的 Svelte 应用程序及其 CSS 渲染到页面上?

ary*_*ing 33

两步,

  • 我们可以使用 .js 将 css 注入到 js 资源中vite-plugin-css-injected-by-js
  • 我们可以通过在 rollup 的配置中禁用块来发出单个 js 资源。

最后结果,

import cssInjectedByJsPlugin from "vite-plugin-css-injected-by-js";

export default defineConfig({
  plugins: [cssInjectedByJsPlugin()],
  build: {
    rollupOptions: {
      output: {
        manualChunks: undefined,
      },
    },
  },
});
Run Code Online (Sandbox Code Playgroud)

正如下面 @TheRockerRush 所建议的,您可能希望使用vite-plugin-singlefile将所有代码捆绑到单个 .html 文件中,尽管 OP 要求单个 .js 文件。


The*_*ush 10

如果您正在寻找解决方案,您可能需要查看vite-plugin-singlefile

  • > 该解决方案不支持多个输出文件 根据插件的名称哈哈 (15认同)
  • 该解决方案不支持多个输出文件 (2认同)

Sce*_*eat 6

这对于 vite 来说并不是开箱即用的,但你可以编写一个快速插件来完成这个任务

const bundle_filename = ''
const css_filename = 'style.css'

defineConfig({
  build: {
    lib: {
      entry: 'src/mycomponent.js',
      name: 'mycomponent.js',
      fileName: () => 'mycomponent.js',
      formats: ['iife'],
    },
    cssCodeSplit: false,
    rollupOptions: {
      plugins: [
        {
          apply: 'build',
          enforce: 'post',
          name: 'pack-css',
          generateBundle(opts, bundle) {
            const {
              [css_filename]: { source: rawCss },
              [bundle_filename]: component,
            } = bundle

            const IIFEcss = `
            (function() {
              try {
                  var elementStyle = document.createElement('style');
                  elementStyle.innerText = ${JSON.stringify(rawCss)}
                  document.head.appendChild(elementStyle)
              } catch(error) {
                console.error(error, 'unable to concat style inside the bundled file')
              }
            })()`

            component.code += IIFEcss

            // remove from final bundle
            delete bundle[css_filename]
          },
        },
      ],
    },
  },
})
Run Code Online (Sandbox Code Playgroud)


小智 2

我为这个问题创建了一个样板 Vite 项目:
https ://github.com/mvsde/svelte-micro-frontend

也许配置对您的情况有所帮助:

import { defineConfig } from 'vite'
import { svelte } from '@sveltejs/vite-plugin-svelte'

export default defineConfig({
  plugins: [
    svelte({
      emitCss: false
    })
  ],

  build: {
    assetsDir: '',
    sourcemap: true,
    lib: {
      entry: 'src/main.js',
      formats: ['iife'],
      name: 'SvelteMicroFrontend',
      fileName: 'svelte-micro-frontend'
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

  • 此配置不会按照 OP 的要求将 CSS 插入到发出的单个 .js 资源中。 (3认同)