module.exports "Module is not defined"

99,211

Solution 1

RequireJS cannot load CommonJS modules as-is. However, there is a minimal modification you can make to them to load them. You have to wrap them in a define call like this:

define(function (require, exports, module) {

  module.exports = {
    Combobox: require('./combobox'),
    Option: require('./option')
  };

});

If you have a bunch of modules you need to convert, or if you are using a third-party library written in the CommonJS pattern and want to convert it as part of a build process, you can use r.js to perform the conversion for you.

Solution 2

The problem is that requireJS doesn't support CommonJS modules only AMD. So if the third party library doesn't support AMD then you'll have to jump through some hoops to get it to work.

If you have the option I would suggest using browserify or webpack for module loading since those are the tools that the majority of the react community have chosen and practically all third-party react components are published on npm as CommonJS modules.

Share:
99,211
joakimnorberg
Author by

joakimnorberg

Updated on April 16, 2020

Comments

  • joakimnorberg
    joakimnorberg about 4 years

    So, I am using RequireJS and React, trying to load a third-party component, which has been installed with:

    npm install react-autocomplete
    

    The structure is here: https://github.com/rackt/react-autocomplete/tree/master/lib

    Now, I have a main.js file, initiated when requireJS is loaded, that looks like this:

    require.config({
    paths: {
          "react" : "react/react",
          "jsx-transformer" : "react/JSXTransformer",
          "react-autocomplete" : "node_modules/react-autocomplete/lib/main"
        }
    });
    
    require(["react"], function(react) {
        console.log("React loaded OK.");
    });
    
    require(["jsx-transformer"], function(jsx) {
        console.log("JSX transformer loaded OK.");
    });
    
    require(['react-autocomplete'], function (Autocomplete) {
        console.log("React autocomplete component loaded OK.");
        var Combobox = Autocomplete.Combobox;
        var ComboboxOption = Autocomplete.Option;
        console.log("Autocomplete initiated OK");
     });
    

    Now, it all loads OK, but the third require statement throws a "module is not defined", for the main.js file in the third-party component, which looks like this:

    module.exports = {
      Combobox: require('./combobox'),
      Option: require('./option')
    };
    

    I've been reading about that this has to do with me trying to require a CommonJS-style module, but I can't figure out how to fix it on my own, as I'm new to this.

    Does anyone have a clear example on how I could get around this?

  • joakimnorberg
    joakimnorberg about 9 years
    Right, guess the problem is that I'll then be fiddling in the third-party component. But thanks!