今天发现了 webpack 一个很有趣的特性,假设存在如下代码:
1 | const getFile = (fileName) => require(`./test/${fileName}`) |
然后你的 test
目录中存在如下文件:
- test.js
- test2.js
- /dir/test.css
- test2.css
原先,我以为这种包含变量的路径可能会导致一个运行时的引入错误,因为看起来对于打包工具来说,它没法确切的知道你要引入的资源是啥?然后应该是得手动把 test
文件夹中的相关资源人工拷贝到 dist
目录的。没想到运行的时候一点毛病都没有,一切正常!
然后猜一下 webpack 会打包哪些资源吧?
好吧,既然让猜了,肯定能猜到是:test.js
test2.js
test.css
test2.css
也就是说如果 require 传入的参数包含变量,webpack 在编译时候的路径分析不会也不可能准确的知道变量的真正可能值,它只会做大限度的把相关的资源都打包。
再看如下代码:
1 | const fileName = '' |
直接说打包的结果吧!是:test2.css
可以看出路径分析的过程还会尽可能地匹配你传入的参数,以实现在最大限度打包相关资源的同时,避免无关资源的引入。很棒!
再看如下代码:
1 | const fileName = `./test/test.css` |
终于!编译阶段就直接报错了,这种情况才符合最初的直觉,直接引入一个变量 webpack 是无法进行任何路径分析的。
最后,这个特性叫做 require with expression