执行npm start时遭遇React CSS Loader加载异常(Ubuntu+Node 4.2.2)
Hey,我来帮你搞定这个问题。从报错信息和你的项目结构来看,核心问题是SCSS里的字体引用路径和实际文件位置不匹配,或者Ubuntu的大小写敏感特性在搞鬼。下面是几个具体的排查和解决步骤:
1. 先确认文件名的大小写(Ubuntu重点注意!)
Ubuntu是大小写严格敏感的系统,如果你在SCSS里写的是roboto-light.eot,但实际字体文件是Roboto-Light.eot或者其他大小写组合,系统就会判定文件不存在。
你可以直接在终端里执行命令,查看目标目录下的文件名:
ls webclient/assets/fonts/Roboto/
把输出的文件名和你SCSS里写的对比,确保完全一致,包括大小写。
2. 检查SCSS中的引用路径是否正确
你的index.scss在webclient/src/styles/目录下,报错里的引用路径是../../assets/fonts/Roboto/roboto-light.eot。我们可以用终端命令验证这个路径是否真的指向存在的文件:
ls webclient/src/styles/../../assets/fonts/Roboto/roboto-light.eot
如果命令返回"No such file or directory",说明路径写错了。咱们可以再核对层级:从webclient/src/styles/往上跳两级正好是webclient/目录,而assets就在这个目录下,所以../../assets/...本身是合理的路径——如果还是找不到,要么是文件没放在对应位置,要么需要调整webpack配置。
3. 调整sass-loader的includePaths配置
你的sass-loader目前只把node_modules加入了includePaths,你可以把项目根目录也加进去,这样在SCSS里就能用更简洁的绝对路径引用资源,避免相对路径算错的问题。
找到你的webpack配置文件,修改sass-loader的配置:
sassLoader: { outputStyle: 'expanded', includePaths: [ path.resolve(__dirname, 'node_modules'), path.resolve(__dirname, './') // 添加项目根目录(webclient目录) ] }
修改后,你在SCSS里就可以直接写assets/fonts/Roboto/roboto-light.eot,不用再纠结相对路径的层级了。
4. 确认字体文件确实存在
如果上面的步骤都没问题,那最后检查一下字体文件是不是真的在webclient/assets/fonts/Roboto/目录下。有时候可能是文件复制遗漏,或者目录名写错了(比如把Roboto写成了roboto)。
内容的提问来源于stack exchange,提问作者Prashant Patel

