背景
首先,我的目录结构如下
.
├── index.js
└── README.txt
index.js
var fs = require('fs');
var path = require('path');
console.log(fs.existsSync(__dirname + '/README.txt'))
console.log(fs.existsSync(__dirname + '/readme.txt'))
思考下,上面 fs.existsSync 执行后,返回是 true 还是 false
// windows、mac下输出 true true
console.log(fs.existsSync(__dirname + '/README.txt')) // true
console.log(fs.existsSync(__dirname + '/readme.txt')) // true
// centos下输出
console.log(fs.existsSync(__dirname + '/README.txt')) // true
console.log(fs.existsSync(__dirname + '/readme.txt')) // false
为什么呢?
因为在windows下,如果你目录中出现README.txt
,那么就无法新建readme.txt
,因为windows认为这两个是一个文件。也就是文件名是大小写不敏感的;而对于linux来讲,认为README.txt
和readme.txt
是两个文件,也就是大小写敏感的,你是可以新建成功的。
不解决会出现什么问题?
目录结构:
.
├── index.js
└── Readme.vue
index.js,引用这个vue文件
import Readme from "./readme.vue"
export default {
Readme
}
如果我们用的是windows/mac电脑开发,那么此时webpack不会报错,因为大小写不敏感,可以在磁盘里找到Readme.vue
;当我们把代码上传到构建服务器(一般都是linux系统),服务器在构建时,因为大小写敏感,发现找不到要引入的文件,就直接报错了,构建无法继续,就会出现经典的一幕,程序猿说:在我本地是正常的啊!
webpack中解决这个问题就需要下面这个插件了
case-sensitive-paths-webpack-plugin
如何解决这个问题?
var fs = require('fs');
var path = require('path');
function fileExistsWithCaseSync(filepath) {
var dir = path.dirname(filepath)
if (dir === path.dirname(dir)) {
return true
}
var filenames = fs.readdirSync(dir)
if (filenames.indexOf(path.basename(filepath)) === -1) {
return false
}
return fileExistsWithCaseSync(dir)
}
console.log(fileExistsWithCaseSync(__dirname + '/README.txt')) // true
console.log(fileExistsWithCaseSync(__dirname + '/readme.txt')) // false