如何在不使用无服务器组件的情况下将 next.js 9 部署到 AWS Lambda

Mar*_*ate 5 aws-lambda next.js serverless

我想简单地使用前面的 API 网关将我的 Next.js 9 部署到 AWS Lambdas 并为指向 S3 的静态路径创建代理,但唯一可用的选项(无需从头开始编写所有内容)是https://github.com/serverless-nextjs/serverless-next.js目前正在使用无服务器组件的测试版(由于不使用 CloudFormation,因此非常有问题并且无法控制创建的资源),这也是 SLS 组件的力量用户使用 CloudFront 这不是我的需要,我一直在创建 PR 环境,为此分配 CloudFront 只是浪费时间/金钱/资源。

我尝试使用旧版本的插件,serverless-nextjs-plugin但它似乎不适用于 Next.js 9,它无法为 .html 生成的页面创建 Lambda。

这条隧道的尽头有光吗?

https://github.com/serverless-nextjs/serverless-next.js/issues/296通过这个问题,看起来没有办法做到这一点。

Mar*_*ate 2

我设法让它发挥作用

serverless.base.yml文件:

service: my-app

provider:
  name: aws
  runtime: nodejs12.x
  timeout: 10 # seconds
  memorySize: 1792 # Mb

custom:
  webpack:
    packager: yarn
    includeModules:
      forceInclude:
        - chalk

functions:
  nextJsApp:
    handler: server.handler
    events:
      - http: 'ANY /'
      - http: 'ANY {proxy+}'
Run Code Online (Sandbox Code Playgroud)

server.js:

const { parse } = require('url');
const next = require('next');
const serverless = require('serverless-http');

const app = next({
  dev: false
});

const requestHandler = app.getRequestHandler();

export const handler = serverless(async (req, res) => {
  const parsedUrl = parse(req.url, true);
  await requestHandler(req, res, parsedUrl);
});
Run Code Online (Sandbox Code Playgroud)

wepback.config.js:

const CopyWebpackPlugin = require('copy-webpack-plugin');
const nodeExternals = require('webpack-node-externals');

module.exports = {
  ...

  externals: [nodeExternals()],
  plugins: [
    new CopyWebpackPlugin({
      patterns: [
        { from: '.next', to: '.next' },
        { from: 'public', to: 'public' }
      ]
    })
  ]
};
Run Code Online (Sandbox Code Playgroud)

这是使用 serverless 和 webpack 的技巧,使用 aserverless.js修改serverless.base.yml并将所有依赖项添加到要包含在捆绑包中的所需依赖项中:

const yaml = require('yaml-boost');
const minimist = require('minimist');
const path = require('path');

module.exports = (() => {
  const params = minimist(process.argv.slice(2));
  const serverless = yaml.load(path.join(__dirname, 'serverless.base.yml'), params);
  const packageJson = require(path.join(__dirname, 'package.json'));

  const dependencies = Object.keys(packageJson.dependencies);
  serverless.custom.webpack.includeModules.forceInclude.push(...dependencies);
  return serverless;
})();
Run Code Online (Sandbox Code Playgroud)