Enigmatic-Smile / serverless-plugin-optimize

⛔️ DEPRECATED ⛔️ Bundle with Browserify, transpile and minify with Babel automatically to your NodeJS runtime compatible JavaScript
https://www.npmjs.com/package/serverless-plugin-optimize
MIT License
130 stars 54 forks source link

how do you install external dependencies? #118

Open JaredAAT opened 3 years ago

JaredAAT commented 3 years ago

when looking at this part of the documentation:

external Array of modules to be copied into node_modules instead of being loaded into browserify bundle. Note that external modules will require it's dependencies within it's directory. (cd external_modules/some-module && npm i --prod)

given a serverless.yml of:

functions:
  resultpdf:
      handler: handler.resultPDF
      runtime: nodejs12.x
      timeout: 20
      memorySize: 1600
      optimize:
        external: ["chrome-aws-lambda"]

how do you go about running cd external_modules/chrome-aws-lambda && npm i --prod?

alecmcgovern commented 2 years ago

@JaredAAT did you ever figure this out? I'm working with the same package chrome-aws-lambda and struggling to include all its dependencies.

alecmcgovern commented 2 years ago

If anyone else runs into this, the solution is to cd into your node_modules in the root of your project and run the install command. This way all the dependencies are included when the external packages are copied over to the optimized build. I added a postinstall command to my package.json so I didn't have to think about running this anytime the repo was cloned or my packages were re-installed.

Note: I also needed to include puppeteer-core in the external packages, and do a similar production install for that package.

serverless.yml

  functionName:
    handler: functions/index.handler
    optimize:
      external: ['chrome-aws-lambda', 'puppeteer-core']

package.json

  "scripts": {
    ...
    "postinstall": "yarn run install:chrome-aws-lambda && yarn run install:puppeteer",
    "install:chrome-aws-lambda": "cd node_modules/chrome-aws-lambda && npm i --production",
    "install:puppeteer": "cd node_modules/puppeteer-core && npm i --production",
  },
wcpines commented 2 years ago

Hey @alecmcgovern I've attempted this solution and when I run it locally (npm exec serverless offline start) I get

Warning: Invalid configuration encountered
  at 'functions.GeneratePdf': unrecognized property 'optimize'

Learn more about configuration validation here: http://slss.io/configuration-validation

I'm not certain the solution you're suggesting is the answer to my own issue, but it seems related. I'm getting the following error when I actually run the lambda:


Error: Error: Could not find expected browser (chrome) locally. Run `npm install` to download the correct Chromium revision (901912).

Relevant part of the code in question:

import chromeAwsLambda from 'chrome-aws-lambda';
import { PDFOptions } from 'puppeteer-core';

export class PDFGenerator {
  static genPdf = async (url: string, options: PDFOptions ): Promise<Buffer> => {
    console.log(`Offline: ${process.env.IS_OFFLINE}`)
    const executablePath = process.env.IS_OFFLINE == 'true'
      ? './node_modules/puppeteer/.local-chromium/mac-1011831/chrome-mac/Chromium.app/Contents/MacOS/Chromium'
      : await chromeAwsLambda.executablePath;

    console.log(`Exec Path: ${executablePath}`)
    const browser = await chromeAwsLambda.puppeteer.launch({
      args: chromeAwsLambda.args,
      executablePath
    });
    const page = await browser.newPage();

Using node16 fwiw.

JaredAAT commented 2 years ago

@wcpines The first error you're seeing is probably because you're using serverless 2/3 and this package isn't actively maintained anymore: https://github.com/FidelLimited/serverless-plugin-optimize/issues/133#issuecomment-1170138648