How to use webpack with a monorepo (yarnpkg workspaces)

后端 未结 3 1422
眼角桃花
眼角桃花 2020-12-30 00:41

I\'m using yarn workspaces where the root directory has a package directory with all my repos. Each repo has its own node_modules directory containing its dependencies. Th

相关标签:
3条回答
  • 2020-12-30 01:13

    Yarn workspaces hoist compatible modules to the root node_modules directory leaving any incompatible (different semver, etc.) modules with the dependent workspace's node_modules directory. If a package is requested without using a relative path it is either native, from node_module's, or possibly a symlinked package from one of your workspaces. You probably want all of those packages to be external.

    how to configure webpack externals to exclude all node_modules directories through the whole project, not just in the root?

    I would try using a function with webpack's external option. You are passed the context of the require, the name of the module requested, and a callback to indicate whether this particular import (require) should be considered external.

    externals: [
        (ctx, req, cb) => {
            if (!/node_modules/.test(ctx) && req[0] !== '.') {
                // Assumes you have defined an "entries" variable
                let notAnEntry = (path) => {
                    return Object.keys(entries).every((entry) => {
                        return entries[entry] !== path
                    });
                };
    
                if (notAnEntry(require.resolve(req))) {
                    // This module is external in a commonjs context
                    return cb(null, `commonjs ${req}`);
                }
            }
    
            cb();
        }
    ]
    
    0 讨论(0)
  • 2020-12-30 01:16

    If using yarn workspaces with webpack-node-externals a better solution than setting modulesFromFile: true is to use the following externals setting in your webpack config:

    externals: [
      nodeExternals(),
      nodeExternals({
        modulesDir: path.resolve(__dirname, 'path/to/root/node_modules'),
      }),
    ],
    

    Essentially using two instances of nodeExternals. 1 for the package node_modules and one for the root node_modules.

    0 讨论(0)
  • 2020-12-30 01:22

    Thanks to @blackxored I was able to fix it on my project.

    In your webpack config file do the following:

    import nodeExternals from 'webpack-node-externals'
    

    Then add

    externals: [
      nodeExternals({
        modulesFromFile: true,
      }),
    ],
    
    0 讨论(0)
提交回复
热议问题