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
两步,
vite-plugin-css-injected-by-js。最后结果,
import cssInjectedByJsPlugin from "vite-plugin-css-injected-by-js";
export default defineConfig({
  plugins: [cssInjectedByJsPlugin()],
  build: {
    rollupOptions: {
      output: {
        manualChunks: undefined,
      },
    },
  },
});
正如下面 @TheRockerRush 所建议的,您可能希望使用vite-plugin-singlefile将所有代码捆绑到单个 .html 文件中,尽管 OP 要求单个 .js 文件。
The*_*ush 10
如果您正在寻找解决方案,您可能需要查看vite-plugin-singlefile。
这对于 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]
          },
        },
      ],
    },
  },
})
小智 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'
    }
  }
})
| 归档时间: | 
 | 
| 查看次数: | 54543 次 | 
| 最近记录: |