踩坑小记——Webpack resolve


前段时间,学习了 WebpackEJSBabel 等工具,在学习 React 及其全家桶时,开始着手开发一些项目,以此巩固和提高。遂在之前一个已有项目的基础上,建立项目文件夹,项目结构如下:

repo
├── todo-list
│  ├── webpack.config.js
│  ├── screenshots
│  ├── server
│  ├── dist
│  └── src
│     ├── components
│     ├── index.html
│     ├── index.jsx
│     ├── layout
│     └── style
├── package.json
├── node_modules
└── README.md

其中,repo 为 Git 文件夹,除了 todo-list 这个文件夹以外还有其他项目文件夹,各个项目共用一个 node_modules,以节省空间

Webpack 入口(Entry)在 index.jsx,一般情况下,引用 components 文件夹下的 container 组件,代码应为:

import Container from './layout/container'

webpack.config.js 配置如下:

const ENTRY = path.join(__dirname, 'src')
const OUTPUT = path.join(__dirname, 'dist')

module.exports = {
    entry: path.join(ENTRY, 'index.jsx'),
    output: {
        path: OUTPUT,
        filename: 'index.bundle.js',
    }
    // ...
}

构建运行,结果却是:

提示无法解析 ./layout/container,猜测可能是相对于 Webpack 配置文件的路径,考虑到项目可能会扩大,因此添加 alias,并且修改 import 语句,

const ENTRY = path.join(__dirname, 'src')
const OUTPUT = path.join(__dirname, 'dist')

module.exports = {
    entry: path.join(ENTRY, 'index.jsx'),
    output: {
        path: OUTPUT,
        filename: 'index.bundle.js',
    },
    resolve: {
		alias: {
			"src": ENTRY
		}
    }
    // ...
}

此处的 "src": ENTRY 似乎多此一举,但当时配置文件在 repo 文件夹,因此还有一个 todo-list 文件夹,路径更长

依旧报错……去掉 alias,还是报错,How old are you? 最后把组件和入口文件全部放在一起,还是报错……

意识到这应该不是路径的问题,可能是 Webpack 配置不对,再去翻文档,resolve.alias,按照文档的意思,alias 配置没有问题,再去 知乎Bing 搜索 alias 的用法,虽然大家写法不一,但总体和我是差不多的,但是 Webpack 似乎没有用上 alias 这一功能~~,虽然也看不出来,都是无法解析~~

最后搜索 Module not found,终于找到了些眉目:Module not found: Error: Can’t resolve ‘react’ in · 简书,在这里,居然发现有 resolve.modules 这一项,山穷水复的情况下,拿来直接用,居然成功打包!!!


文档如下:

resolve.modules
[string]: ['node_modules']
告诉 webpack 解析模块时应该搜索的目录。
……
如果你想要添加一个目录到模块搜索目录,此目录优先于 node_modules/ 搜索

该选项给出解析时的路径,默认是 node_modules,查找是会先从最近的 node_modules 目录里找,找不到则往上层找~~,因此,我之前共用一个包文件夹的设想是成功的~~

可添加自定义的模块,路径应写在 'node_modules' 之前


因此,在这里,应配置为:

const ENTRY = path.join(__dirname, 'src')
const OUTPUT = path.join(__dirname, 'dist')

module.exports = {
    entry: path.join(ENTRY, 'index.jsx'),
    output: {
        path: OUTPUT,
        filename: 'index.bundle.js',
    },
    resolve: {
        extensions: ['.js', '.jsx'],
        modules: [ENTRY, 'node_modules']
    }
	// ...
}

至于 alias 和 index.js 中的 import 语句,爱咋样咋样,保持原样即可


文章作者: Palm Civet
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Palm Civet !
 上一篇
踩坑小记——薛定谔的 Console.log() 踩坑小记——薛定谔的 Console.log()
当你在控制台展开打印出来的数组(或者对象)的时候,如果此时该数组(或对象)的数据已经发生了改变,那么将显示改变之后的数据。
2019-09-01
下一篇 
IRC 浅尝 IRC 浅尝
IRC 是一种互联网聊天方式,采用分布式的客户端/服务器架构,每个 IRC 网络由多个服务器连接而成,几乎只要有互联网就可以聊天。
2019-05-22
  目录