【问题标题】:I'm getting an error building a sveltekit project我在构建 sveltekit 项目时遇到错误
【发布时间】:2021-11-26 04:00:03
【问题描述】:

我正在构建一个 sveltekit 项目。我所做的一件事是创建了一种自定义类型的文件,该文件在构建或运行开发服务器时转换为 *.svelte 文件。默认情况下,sveltekit 包含汇总扩展 rollup-plugin-dynamic-import-variables,它试图解析我的自定义文件(谁知道为什么?)并抛出“意外令牌”错误。我正在尝试将该扩展名配置为忽略我的自定义文件,但到目前为止没有成功。这是我尝试的 svelte.config.js 文件:

// @type {import('@sveltejs/kit').Config}
var config;

import adapter from '@sveltejs/adapter-static';

import dynamicImportVariables from 'rollup-plugin-dynamic-import-variables';

config = {
  kit: {
    // --- hydrate the <div id="svelte"> element in src/app.html
    target: '#svelte',
    adapter: adapter({
      pages: 'build',
      assets: 'build',
      fallback: null
    }),
    vite: {
      plugins: [
        dynamicImportVariables({
          warnOnError: true,
          exclude: '**'
        })
      ]
    }
  }
};

export default config;

老实说,我不会在任何地方使用动态导入,因此我会接受完全禁用扩展作为解决方案。但是任何可以让它忽略我的自定义文件的东西也可以。

【问题讨论】:

  • 有问题的文件名为 index.starbucks,它包含:#starbucks 网页 h1 The Wizard of Oz 如果您将此类文件放在 src/routes 文件夹中,您'将得到以下错误: Unexpected token (1:0) SyntaxError: Unexpected token (1:0) at Object.pp$5.raise (C:\Users\johnd\oz\node_modules\vite\dist\node\chunks\ dep-36bf480c.js:47485:13) 在 Object.pp.unexpected (C:\Users\johnd\oz\node_modules\vite\dist ...等。

标签: rollupjs sveltekit vite


【解决方案1】:

更新: SvelteKit 1.0.0 支持routes configuration,它可以从src/routes 目录中排除文件。 config 值是一个函数,它接收文件路径作为参数,并返回true 以将文件用作路由。

例如,以下routes 配置从路由中排除*.starbucks 文件:

// sveltekit.config.js
⋮
const config = {
  kit: {
    ⋮
    routes: filepath => {
      return ![
        // exclude *.starbucks files
        /\.starbucks$/,

        // original default config
        /(?:(?:^_|\/_)|(?:^\.|\/\.)(?!well-known))/,
      ].some(regex => regex.test(filepath))
    },
  },
}

demo


原答案:

rollup-plugin-dynamic-import-variables 实际上包含在 Vite 中。配置Vite的插件,设置the build.dynamicImportVarsOptions property:

// svelte.config.js
/** @type {import('@sveltejs/kit').Config} */
const config = {
  kit: {
    // hydrate the <div id="svelte"> element in src/app.html
    target: "#svelte",
    vite: {
      build: {
        dynamicImportVarsOptions: {
          exclude: [/node_modules/, /\.starbucks$/],
        },
      },
    },
  },
}

export default config

但这并不能解决问题...

SvelteKit 处理src/routes/ 下的所有文件,以便它们自动导入到输出应用程序(.svelte-kit/build/app.js)中,这将导致相同的错误。

选项 1:私有模块

您可以将src/routes/*.starbucks 文件设置为private module(文件名中有一个前导下划线)来排除它:

src/routes/_home.starbucks ?
src/routes/_index.starbucks ?
src/routes/index.svelte

选项 2:将文件移到 src/routes 之外

或者,将那些*.starbucks 文件移到src/routes/ 之外(例如,移到src/starbucks/src/lib/):

src/routes/index.svelte
src/starbucks/home.starbucks ?
src/starbucks/index.starbucks ?
src/lib/home.starbucks ?
src/lib/index.starbucks ?

【讨论】:

  • 谢谢你,tony19,尤其是在我(不是第一次)抱怨堆栈溢出改变了我的 cmets 格式之后。我从未听说过“私有模块”。我更喜欢配置包含/排除哪些文件的选项,但就目前而言,选项 1 似乎是最好的。同时,我已经使用(并且现在将继续使用)选项 2 的变体。我创建了一个完全独立的目录,名为 '%src',它与 'src' 目录平行。看,我转换的不仅仅是 *.starbucks 文件。
  • 在 %src 树的任何位置找到的任何我想要转换的类型的文件都会被转换,然后复制到 'src' 目录中的相应位置。将我的并行目录命名为 %src 的好处是,给定我要转换的文件的完整路径,我可以简单地将完整路径中的 '%' 替换为 '' 并获得转换后文件所在位置的相应完整路径。无论如何,再次感谢您的帮助。
  • @JohnDeighan SvelteKit 1.0.0 添加了kit.routes 以启用从src/routes 排除文件。查看更新的演示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2020-08-18
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 2014-06-12
相关资源
最近更新 更多