oo

OSGi Bundles and npm Package Structure

To deploy JavaScript modules, you must create an OSGi bundle with the npm dependencies extracted from the project’s node_modules folder and modify them to work with the Liferay AMD Loader. The liferay-npm-bundler automates this process for you, creating a bundle similar to the one below:

  • my-bundle/
    • META-INF/
      • resources/
        • package.json
          • name: my-bundle-package
          • version: 1.0.0
          • main: lib/index
          • dependencies:
            • my-bundle-package$isarray: 2.0.0
            • my-bundle-package$isobject: 2.1.0
        • lib/
          • index.js
        • node_modules/
          • my-bundle-package$isobject@2.1.0/
            • package.json
              • name: my-bundle-package$isobject
              • version: 2.1.0
              • main: lib/index
              • dependencies:
                • my-bundle-package$isarray: 1.0.0
          • my-bundle-package$isarray@1.0.0/
            • package.json
              • name: my-bundle-package$isarray
              • version: 1.0.0
          • my-bundle-package$isarray@2.0.0/
            • package.json
              • name: my-bundle-package$isarray
              • version: 2.0.0

The packages inside node_modules are the same format as the npm tool and can be copied (after processing for things like converting to AMD, for example) from a standard node_modules folder. The node_modules folder can hold any number of npm packages (even different versions of the same package), or no npm packages at all.

Now that you know the structure for OSGi bundles containing npm packages, you can learn how the liferay-npm-bundler handles inline JavaScript packages.

Inline JavaScript packages

The resulting OSGi bundle that the liferay-npm-bundler creates is configured to deploy one inline JavaScript package (named my-bundle-package in the example) with several npm packages that are placed inside the node_modules folder, one package per folder.

The inline package is nested in the OSGi standard META-INF/resources folder and is defined by a standard npm package.json file.

The inline package is optional, but only one inline package is allowed per OSGi bundle. The inline package usually provides the JavaScript code for a widget, when the OSGi bundle contains one. Note that the architecture does not differentiate between inline and npm packages once they are published. The inline package is only used for organizational purposes.

Now you know how the liferay-npm-bundler creates OSGi bundles for npm packages!