Understanding Bundler Configuration Presets
The Liferay npm bundler is deprecated of Liferay 2024.Q4/Portal GA129, and it’s planned for future removal.
The liferay-npm-bundler comes with a default configuration preset: liferay-npm-bundler-preset-standard. You may omit the liferay-npm-bundler prefix from the npm package name in your .npmbundlerrc file. This preset configures several plugins for the build process and is automatically used (even if the .npmbundlerrc is missing), unless you override it with one of your own. Running the liferay-npm-bundler with this preset applies the config file from liferay-npm-bundler-preset-standard:
{
"/": {
"plugins": ["resolve-linked-dependencies"],
".babelrc": {
"presets": ["liferay-standard"]
},
"post-plugins": ["namespace-packages", "inject-imports-dependencies"]
},
"*": {
"copy-plugins": ["exclude-imports"],
"plugins": ["replace-browser-modules"],
".babelrc": {
"presets": ["liferay-standard"]
},
"post-plugins": [
"namespace-packages",
"inject-imports-dependencies",
"inject-peer-dependencies"
]
}
}
The configuration above states that for all npm packages (*) the pre-process phase (plugins) must run the replace-browser-modules plugin. Setting this to post-plugins runs it during the post phase instead.
You can override configuration preset values by adding your own configuration to your project’s .npmbundlerrc file. For instance, using the configuration preset example above, you can define your own .babelrc value in .npmbundlerrc file to override the defined “liferay-standard” babelrc preset.
Liferay Standard Preset
The liferay-standard preset applies the following plugins to packages:
-
exclude-imports: Exclude packages declared in the
importssection from the build. -
inject-imports-dependencies: Inject dependencies declared in the
importssection in the dependencies’package.jsonfiles. -
inject-peer-dependencies: Inject declared peer dependencies (as they are resolved in the project’s
node_modulesfolder) in the dependencies’package.jsonfiles. -
namespace-packages: Namespace package names based on the root project’s package name to isolate packages per project and avoid collisions. This prepends
<project-package-name>$to each package name appearance inpackage.jsonfiles. -
replace-browser-modules: Replaces the server side files for modules listed under
browser/unpkg/jsdelivrsection ofpackage.jsonwith their browser counterparts. -
resolve-linked-dependencies: Replace linked dependencies versions appearing in
package.jsonfiles (those obtained from local file system or GitHub, for example) by their real version numbers, as resolved in the project’snode_modulesdirectory.
Liferay Babel Preset
The bundler also runs Babel with the babel-preset-liferay-standard preset, which invokes the following plugins:
-
babel-plugin-normalize-requires: Normalize AMD
require()calls. -
babel-plugin-transform-node-env-inline: Inline the
NODE_ENVenvironment variable, and if it’s part of a binary expression (eg.process.env.NODE_ENV === "development"), then statically evaluate and replace it. -
babel-plugin-minify-dead-code-elimination: Inline bindings when possible. Tries to evaluate expressions and prunes unreachable as a result.
-
babel-plugin-wrap-modules-amd: Wrap modules inside an AMD
define()module. -
babel-plugin-name-amd-modules: Name AMD modules based on package name, version, and module path.
-
babel-plugin-namespace-modules: Namespace modules based on the root project’s package name, prepending
<project-package-name>$. Wrap modules inside an AMDdefine()module for each module name appearance (indefine()orrequire()calls) so that the packages are localized per project and don’t clash. -
babel-plugin-namespace-amd-define: Add a prefix to AMD
define()calls (by defaultLiferay.Loader.).
Now you know the available configuration presets for .npmbundlerrc and how they work.