【问题标题】:SvelteKit and adapter-node -> productionSvelteKit 和适配器节点 -> 生产
【发布时间】:2021-12-01 03:37:42
【问题描述】:

很好奇其他人正在使用 SvelteKit 适配器节点构建做什么以将它们投入生产。

例如...

  • 提供预压缩文件
  • 设置缓存 TTL
  • 可能类似于helmet

为适配器定义一个入口点是否更好,例如实现 polka/express/connect 这样的 server.js...

// src/server.js
import { assetsMiddleware, prerenderedMiddleware, kitMiddleware } from '../build/middlewares.js'
import polka from 'polka'
import compression from 'compression'
import helmet from 'helmet'

const app = polka()

app.use(helmet())
app.use(assetsMiddleware, prerenderedMiddleware, kitMiddleware)
app.use(compression())

app.listen(3000)

还是在 hooks.js 的 handler() 方法中实现类似的功能更好?

有兴趣了解人们从构建通过适配器节点到生产的过程。

【问题讨论】:

    标签: node.js http-compression sveltekit


    【解决方案1】:

    在检查了 adapter-node 在构建文件夹中生成的内容后,我决定在 svelte.config.jsentryPoint 属性/strong> 到./src/server.mjs,它被添加到构建中。 hooks.js/ts 中的 handle() 方法不允许对静态内容进行任何控制。

    在下面的代码中,我为非 https 设置了重定向,并使用头盔来加强安全性。

    // /src/server.mjs
    import polka from 'polka'
    import helmet from 'helmet'
    import { assetsMiddleware, prerenderedMiddleware, kitMiddleware } from '../build/middlewares.js'
    
    const { PORT = 3000, DOMAIN } = process.env
    
    const isHttpPerHeroku = (req) =>
        req.headers['x-forwarded-proto'] &&
        req.headers['x-forwarded-proto'] !== 'https'
    
    polka()
      // On Heroku (only), redirect http to https
      .use((req, res, next) => {
        if (isHttpPerHeroku(req)) {
          let url = `${DOMAIN}${req.url}`
          let str = `Redirecting to ${url}`
          res.writeHead(302, {
            Location: url,
            'Content-Type': 'text/plain',
            'Content-Length': str.length
          })
          res.end(str)
        } else next()
      })
    
      // Apply all but two helmet protections
      .use(helmet({
        contentSecurityPolicy: false, // override below
        referrerPolicy: false // breaks "Sign in with Gooogle"
      }))
    
      // Set the Content Security Policy on top of defaults
      .use(helmet.contentSecurityPolicy({
        useDefaults: true,
        directives: {
          scriptSrc: [
            "'self'",
            `'unsafe-inline'`,
            'https://accounts.google.com/gsi/',
            'https://assets.braintreegateway.com/web/',
            'https://platform.twitter.com/',
            'https://www.google-analytics.com/',
            'https://www.google.com/recaptcha/',
            'https://www.googletagmanager.com/',
            'https://www.gstatic.com/recaptcha/'
          ],
          connectSrc: [
            "'self'",
            'https://accounts.google.com/gsi/',
            'https://api.sandbox.braintreegateway.com/merchants/',
            'https://api.braintreegateway.com/merchants/',
            'https://origin-analytics-sand.sandbox.braintree-api.com/',
            'https://payments.sandbox.braintree-api.com/',
            'https://payments.braintree-api.com/',
            'https://stats.g.doubleclick.net/',
            'https://www.google-analytics.com/',
            'https://platform.twitter.com/',
            'https://assets.braintreegateway.com/web/',
            'https://www.googletagmanager.com/',
            'https://www.google.com/recaptcha/',
            'https://www.gstatic.com/recaptcha/',
            'https://fonts.gstatic.com/',
            'https://client-analytics.braintreegateway.com/'
          ],
          childSrc: [
            "'self'",
            'https://accounts.google.com/gsi/',
            'https://assets.braintreegateway.com/web/',
            'https://platform.twitter.com/',
            'https://syndication.twitter.com/i/jot',
            'https://www.google.com/maps/',
            'https://www.google.com/recaptcha/'
          ],
          fontSrc: [
            "'self'",
            'https:',
            'data:',
            'https://fonts.gstatic.com'
          ],
          imgSrc: [
            "'self'",
            'data:',
            'https://www.google-analytics.com/',
            'https://www.googletagmanager.com/',
            'www.w3.org/2000/svg',
          ],
          frameSrc: [
            'https://accounts.google.com/gsi/',
            'https://www.google.com/recaptcha/',
            'https://platform.twitter.com/',
            'https://assets.braintreegateway.com/web/',
            'https://www.google.com/maps/',
            'https://syndication.twitter.com/i/jot'
          ],
          workerSrc: [
            "'self'"
          ]
        }
      }))
    
      // Load the SvelteKit build
      .use(assetsMiddleware, prerenderedMiddleware, kitMiddleware)
    
      // Listen on the appropriate port
      .listen(PORT)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 2021-11-10
      • 2022-06-23
      • 2021-08-03
      • 2019-09-30
      • 1970-01-01
      • 2019-04-28
      • 2017-05-27
      相关资源
      最近更新 更多