dynamic-alias-resolve-plugin

dynamic alias resolve plugin

Usage no npm install needed!

<script type="module">
  import dynamicAliasResolvePlugin from 'https://cdn.skypack.dev/dynamic-alias-resolve-plugin';
</script>

README

dynamic-alias-resolve-plugin

Introduction

Thanks for the help of enhanced-resolve, we can define alias for path, but it's static, in some cases we may want alias point to A path or B path, in other words, we want dynamic alias. enhanced-resolve is based on tapable, so we can write a plugin to make it.

Read this in other languages: english, 简体中文

Prerequisites

This module requires webpack v4 and above.

Installation

npm install -D dynamic-alias-resolve-plugin

Usage

In your webpack config, require() the dynamic-alias-resolve-plugin plugin as follows:

const DynamicAliasResolvePlugin = require("dynamic-alias-resolve-plugin");

and finally, add the plugin to your resolve configuration's plugins array

// https://webpack.js.org/configuration/resolve/#resolveplugins
resolve: {
  plugins: [
    new DynamicAliasResolvePlugin({
      // alias you want to make it dynamic
      alias: "@",
      // pathA or pathB should be replaced with real path
      // "request" is raw request object from enhanced-resolve
      // "alias" is matched alias of current request.(eg. "@" in "@/login.less")
      dynamic: (request, alias) => "pathA or PathB",
      // we just want less file to be handled by this plugin
      pattern: /\.less$/,
    }),
  ];
}

Options

properties type default
alias Array<string> ['@']
dynamic function(request,alias)=>string|null|false|undefined ()=>null
pattern RegExp /.*/
extensions Array<string> ["js", "mjs", "ts", "jsx", "tsx"]

Description Of Options

alias

alias you want to make it dynamic

dynamic

return value should be absolute path,all false value('',false,null) will be ignored. request is raw enhanced-resolve request object, alias is current alias you want make it dynamic. (eg. "@" in "@/login.less")

pattern

files needs handled by this plugin

extensions

When we import a module we always ignore the extension, for instance, if we want to import something from {path}/a.js we just write import {something} from {path}/a instead of import {something} from {path}/a.js, which is convenient. However, when we resolve a module to an absolute path, we must have the file extension info. If you specified this option, we will try to match extensions that you specied when we encounter a module that don't have a file extension, or we will use the default extensions(["js", "mjs", "ts", "jsx", "tsx"]).