Code Monkey home page Code Monkey logo

esbuild-node-externals's Introduction

esbuild-node-externals

npm version npm downloads per month

Esbuild plugin to easily exclude node modules during builds.

When bundling with Esbuild for the backend by default it will try to bundle all the dependencies. However it's a good idea to not bundle all the node_modules dependencies. This plugin will scan the dependencies included in your project and will exclude them from the final bundle.

Installation

This plugin requires minimum Node.js 12, and Esbuild 0.12+.

# with npm
npm install --save-dev esbuild-node-externals

# with yarn
yarn add --dev esbuild-node-externals

Usage

When you call the esbuild build API, add the esbuild-node-externals plugin.

// Your bundler file
const esbuild = require('esbuild');
const { nodeExternalsPlugin } = require('esbuild-node-externals');

esbuild.build({
  entryPoints: ['src/index.js'],
  bundle: true,
  platform: 'node',
  outfile: 'dist/index.js',
  plugins: [nodeExternalsPlugin()],
});

Options

When calling this package, you can pass an options object.

// Your bundler file
const esbuild = require('esbuild');
const { nodeExternalsPlugin } = require('esbuild-node-externals');

esbuild.build({
  // ...
  plugins: [
    nodeExternalsPlugin({
      packagePath: 'path/to/package.json',
    }),
  ],
});

options.packagePath

Path to your package.json. Can be a string or an array of strings. If you are using a monorepo you can provide a list of all the package.json to check.

If this option is not specified the default behavior is to start with the current directory's package.json then go up scan for all package.json files in parent directories recursively until either the root git directory is reached or until no other package.json can be found.

options.dependencies (default to true)

Make package.json dependencies external.

options.devDependencies (default to true)

Make package.json devDependencies external.

options.peerDependencies (default to true)

Make package.json peerDependencies external.

options.optionalDependencies (default to true)

Make package.json optionalDependencies external.

options.allowList (default to [])

An array for the externals to allow, so they will be included in the bundle. Can accept exact strings ('module_name'), regex patterns (/^module_name/), or a function that accepts the module name and returns whether it should be included.

options.allowWorkspaces (default to false)

Automatically exclude all packages defined as workspaces (workspace:*) in a monorepo.

options.cwd (default to buildOptions.absWorkingDir || process.cwd())

Sets the current working directory for the plugin.

Inspiration

This package and the implementation are inspired by the work of @liady on webpack-node-externals for webpack and @Septh on rollup-plugin-node-externals for rollup.

License

MIT © Léo Pradel

esbuild-node-externals's People

Contributors

antongolub avatar bradleygore avatar chambo-e avatar dw225 avatar fernandolguevara avatar fm-sz avatar github-actions[bot] avatar hudovisk avatar james-mnemosyne avatar jgoz avatar kevinji avatar mbiegert avatar pradel avatar webdeveric avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

esbuild-node-externals's Issues

Peer dependency version

Hello there, would you mind improving the peer dependency specification of the esbuild-node-externals package? It currently specifies
esbuild: ^0.13.0 which leads to yarn complaining when upgrading esbuild to v0.14. The reason is because the ^ only allows newer versions that do not increment the first non-zero portion of the version. In your readme you write that esbuild from version 0.8 is supported, so I suggest something like esbuild: >0.8.

Or probably better if you want to check for breaking changes with each release that bumps the minor version counter you could specify a range: esbuild: 0.8 - 0.13.

If you want to play around with the version specifier, there's this site: https://semver.npmjs.com/

Support external by package name

I would want to make external just one package, sometimes two. There's externals in webpack. It is useful for packages that have binaries.

If you agree, I can submit a PR.

Not marking packages which contains slash on its name as external

First of all, thank you for this awesome plugin!

However, I run into an issue. Some npm dependencies aren't marked as external. When I check the onResolve code, turns out that it only checks the first part of args.path, split by the forward slash character. This made the plugin misses some package such as @typegoose/typegoose, since it will compare it to @typegoose and will return mismatch!

On the meantime, I have forked your repo and provided my solution on this issue. You might want to implement it, or maybe you have your own fix.

Update `peerDependencies` to allow latest `esbuild`

esbuild 0.15 has been released and this error occurs during npm install. --force is needed to ignore the error.

npm ERR! Found: [email protected]
npm ERR! node_modules/esbuild
npm ERR!   dev esbuild@"^0.15.5" from the root project
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! peer esbuild@"0.12 - 0.14" from [email protected]
npm ERR! node_modules/esbuild-node-externals
npm ERR!   dev esbuild-node-externals@"^1.4.1" from the root project

Potential bug with allowList

Hi :)

I found a potential bug in the plugin's onResolve hook. When i have a scoped package in my allowList like @myrepo/foobar and want to import a subpath of it @myrepo/foobar/logging the plugin would ignore bundling of the package and set external: true for the package.

if (options.allowList.includes(args.path)) {

Example:

// in plugin
esbuild.build({
  // ...
  plugins: [nodeExternalsPlugin({
    allowList: ['@myrepo/foobar']
  })],
});

// in code
import logging from '@myrepo/foobar/logging'

Outcome: The plugin would mark @myrepo/foobar as external.
Expected: The plugin would NOT mark @myrepo/foobar as external

Thanks for the lib btw :)

Support for ignoring node_modules in sibling packages in monorepo

Consider a pnpm monorepo:

packages/foo (depends on axios, bar)
packages/bar (depends on express)

I would like to have foo and bar compiled, but keep axios and express as external.

If I create the build script for foo:

const { build } = require('esbuild')
const { nodeExternalsPlugin } = require('esbuild-node-externals')

build({
  // ...
  plugins: [
    nodeExternalsPlugin({
      allowList: ['bar']
    })
  ]
})

then foo, bar and express are compiled, and only axios is considered external.

Ideally, I would like the plugin to handle the monorepo setup automatically (recognize that bar is not even a package inside node_modules without having to specify any option, not even allowList).

Bug: Using `esbuild-node-externals` breaks esbuild tree-shaking

Hey there! I was attempting to debug a tree-shaking issue I was seeing and identified that when I include this package, esbuild's out-of-the-box tree-shaking fails to execute. I have a repro that you can view here: dustinsgoodman/serverless-microservices-graphql-template#85

What I'm finding is if I include this plugin, I have my node_modules bundled up separately like I want, but then my main bundle is still including all imported functions regardless of use in the app. There are screenshots in the linked PR highlighting the lack of tree-shaking if you look for at the "sqs" imports.

Let me know what additional information I can provide.

Support allowlist

Hi, awesome plugin!

Would you consider supporting allowlist in the same fashion as the webpack plugin? The idea is that dependencies included in the allowlist would be bundled in the output.

Alternatively I can submit a PR?

Support for esbuild v0.19

Currently, this package requires esbuild within this version range:

"peerDependencies": {
    "esbuild": "0.12 - 0.18"
  },

Alternatively, if there is some way to do within esbuild core what this packages is doing for versions after 0.18, could we document it within the readme? I did a quick look at the changelog in esbuild but am unclear on whether its enhancements make this package unneeded.

Thank you 😄

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.