Hello Magento Friends,
Sometimes, you may need to create a custom RequireJS file to add custom functionality or extend existing features. In this blog, we will guide you through the process of creating a custom RequireJS file in Magento 2.
Before diving into the implementation, it’s important to understand how Magento 2 utilizes RequireJS. Magento 2 uses RequireJS to load JavaScript modules asynchronously, which helps in improving page load times by only loading the necessary scripts when required. The requirejs-config.js file is where you configure your custom JavaScript files, dependencies, and paths.
Steps to Create Custom Require JS File in Magento 2:
Step 1: Create a “di.xml” file inside the Extension etc folder.
app\code\Vendor\Extension\etc
Then add the code as follows
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Framework\RequireJs\Config\File\Collector\Aggregated"> <plugin name="requirejsConfigPlugin" type="Vendor\Extension\Plugin\RequireJs\AfterFiles" sortOrder="100" /> </type> </config>
Step 2: Now create the “Afterfiles.php” file inside the Extension Plugin folder.
app\code\Vendor\Extension\Plugin\RequireJs
And include the code as below
<?php namespace Vendor\Extension\Plugin\RequireJs; use Vendor\Extension\Helper\Data; use Magento\Framework\Component\ComponentRegistrar; use Magento\Framework\Component\ComponentRegistrarInterface; use Magento\Framework\RequireJs\Config\File\Collector\Aggregated; use Magento\Framework\View\File; use Magento\Framework\View\File\Factory; class Afterfiles { const MODULE_NAME = 'Vendor_Extension'; protected $fileFactory; private $componentRegistrar; public function __construct( Factory $fileFactory, ComponentRegistrarInterface $componentRegistrar, ) { $this->fileFactory = $fileFactory; $this->componentRegistrar = $componentRegistrar; } /** * Load mage-requirejs-config.js when meet the condition * @param Aggregated $subject * @param $result * @return File[] */ public function afterGetFiles( Aggregated $subject, $result ) { /* You can add your custom conditions here to check extension enable or disable */ $currentModulePath = $this->componentRegistrar->getPath(ComponentRegistrar::MODULE, self::MODULE_NAME); $fileName = $currentModulePath.'/view/frontend/mage-requirejs-config.js'; $newFile = $this->fileFactory->create($fileName, self::MODULE_NAME, null, false); $result[] = $newFile; return $result; } }
Step 3: Now create the “mage-requirejs-config.js” file inside the Extension Web folder.
app\code\Vendor\Extension\view\frontend\
Then, add the following code
Note: Here, we have overridden the login.js file. You can override the file as per your requirement.
var config = { map: { '*': { 'Magento_Customer/js/action/login' : 'Vendor_Extension/js/action/login', } } };
Step 4: Now override the “login.js” file inside the Extension js folder.
app\code\Vendor\Extension\view\frontend\web\js\action
Now add the following code snippet
/** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ define([ 'jquery', 'mage/storage', 'Magento_Ui/js/model/messageList', 'Magento_Customer/js/customer-data', 'mage/translate' ], function ($, storage, globalMessageList, customerData, $t) { 'use strict'; /* custom require js call check */ console.log('called Custom js'); var callbacks = [], /** * @param {Object} loginData * @param {String} redirectUrl * @param {*} isGlobal * @param {Object} messageContainer */ action = function (loginData, redirectUrl, isGlobal, messageContainer) { messageContainer = messageContainer || globalMessageList; let customerLoginUrl = 'customer/ajax/login'; if (loginData.customerLoginUrl) { customerLoginUrl = loginData.customerLoginUrl; delete loginData.customerLoginUrl; } return storage.post( customerLoginUrl, JSON.stringify(loginData), isGlobal ).done(function (response) { if (response.errors) { messageContainer.addErrorMessage(response); callbacks.forEach(function (callback) { callback(loginData); }); } else { callbacks.forEach(function (callback) { callback(loginData); }); customerData.invalidate(['customer']); if (response.redirectUrl) { window.location.href = response.redirectUrl; } else if (redirectUrl) { window.location.href = redirectUrl; } else { location.reload(); } } }).fail(function () { messageContainer.addErrorMessage({ 'message': $t('Could not authenticate. Please try again later') }); callbacks.forEach(function (callback) { callback(loginData); }); }); }; /** * @param {Function} callback */ action.registerLoginCallback = function (callback) { callbacks.push(callback); }; return action; });
Output:
Conclusion:
Creating a custom RequireJS file in Magento 2 allows you to add bespoke functionality and enhance the front-end experience of your e-commerce store. By following the steps outlined above, you can seamlessly integrate custom JavaScript modules into your Magento 2 store, ensuring that your code is organized, maintainable, and performs optimally.
If you have any questions or run into issues, feel free to leave a comment below, and we’ll be happy to help!
Happy Coding!