This is an example to my article “How webpack’s ContextReplacementPlugin works”
Each time webpack encounters a dynamic import like this:
require('./locale/' + name + '.js')it extracts from it three pieces of information:
- directory in which to search for the files (
./locale) - regular expression to test the files against (
/^.*\.js) - and if webpack should look for the files in the subdirectories (always
trueby default).
Here’re some examples of dynamic imports and corresponding contexts.
require(path);When you specify only a single variable, there isn’t enough information for webpack to create a context. You’ll see the following warning when doing a build:
WARNING in ./index.js
Critical dependency: the request of a dependency is an expression
require(path + '.js');regular expression: ^.*\.js$, recursive: true
require(path + '/index.js');regular expression: ^.*\/index\.js$, recursive: true
require('./existing-directory/' + path + '/index.js');regular expression: ^.*\/index\.js$, directory: absolute path of ./existing-directory, recursive: true
require('./non-existing-directory/' + path + '/index.js');You’ll see the following error when doing a build:
Module not found: Error: Can't resolve './non-existing-directory' in '<absolute-path>/index.js'
require(part1 + 'staticPart2' + part3 + '.js');regular expression: ^.*\.js$, recursive: true
(All the expressions in the middle of concatenation are not evaluated.)
require('./existing-directory/' + part1 + 'staticPart2' + part3 + '.js');regular expression: ^.*\.js$, directory: absolute path of ./existing-directory, recursive: true
(All the expressions in the middle of concatenation are not evaluated.)
require(flag ? 'staticPathA' : 'staticPathB');
require('staticPathA' + 'staticPathB');
require('staticPathA'.substr(0, 5));These are simpler expressions that don’t require creating a context. See parser evaluation
Follow me on Twitter: @iamakulov