JavaScript

超轻量级php框架startmvc

使用JavaScript实现node.js中的path.join方法

更新时间:2020-07-20 09:42:01 作者:startmvc
Node.JS中的path.join非常方便,能直接按相对或绝对合并路径,使用:path.join([path1],[path2],[...])

Node.JS中的 path.join 非常方便,能直接按相对或绝对合并路径,使用: path.join([path1], [path2], [...]),有时侯前端也需要这种方法,如何实现呢?

其实直接从 node.js 的 path.js 拿到源码加工一下就可以了:

1. 将 const 等 es6 属性改为 var,以便前端浏览器兼容 2. 添加一个判断路戏分隔符的变量 sep,即左斜杠还是右斜杠,以第一个路戏分隔符为准 3. 将引用的变量和函数放到一个文件里就可以了:

Path 的源码: https://github.com/nodejs/node/blob/master/lib/path.js


var CHAR_FORWARD_SLASH = 47
var CHAR_BACKWARD_SLASH = 92
var CHAR_DOT = 46
function isPathSeparator(code) {
 return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;
}
function isPosixPathSeparator(code) {
 return code === CHAR_FORWARD_SLASH;
}
function normalize(path) {
 if (path.length === 0)
 return '.';
 var isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;
 var trailingSeparator =
 path.charCodeAt(path.length - 1) === CHAR_FORWARD_SLASH;
 // Normalize the path
 path = normalizeString(path, !isAbsolute, '/', isPosixPathSeparator);
 if (path.length === 0 && !isAbsolute)
 path = '.';
 if (path.length > 0 && trailingSeparator)
 path += '/';
 if (isAbsolute)
 return '/' + path;
 return path;
}
function normalizeString(path, allowAboveRoot, separator, isPathSeparator) {
 var res = '';
 var lastSegmentLength = 0;
 var lastSlash = -1;
 var dots = 0;
 var code;
 for (var i = 0; i <= path.length; ++i) {
 if (i < path.length)
 code = path.charCodeAt(i);
 else if (isPathSeparator(code))
 break;
 else
 code = CHAR_FORWARD_SLASH;
 if (isPathSeparator(code)) {
 if (lastSlash === i - 1 || dots === 1) {
 // NOOP
 } else if (lastSlash !== i - 1 && dots === 2) {
 if (res.length < 2 || lastSegmentLength !== 2 ||
 res.charCodeAt(res.length - 1) !== CHAR_DOT ||
 res.charCodeAt(res.length - 2) !== CHAR_DOT) {
 if (res.length > 2) {
 const lastSlashIndex = res.lastIndexOf(separator);
 if (lastSlashIndex !== res.length - 1) {
 if (lastSlashIndex === -1) {
 res = '';
 lastSegmentLength = 0;
 } else {
 res = res.slice(0, lastSlashIndex);
 lastSegmentLength = res.length - 1 - res.lastIndexOf(separator);
 }
 lastSlash = i;
 dots = 0;
 continue;
 }
 } else if (res.length === 2 || res.length === 1) {
 res = '';
 lastSegmentLength = 0;
 lastSlash = i;
 dots = 0;
 continue;
 }
 }
 if (allowAboveRoot) {
 if (res.length > 0)
 res += `${separator}..`;
 else
 res = '..';
 lastSegmentLength = 2;
 }
 } else {
 if (res.length > 0)
 res += separator + path.slice(lastSlash + 1, i);
 else
 res = path.slice(lastSlash + 1, i);
 lastSegmentLength = i - lastSlash - 1;
 }
 lastSlash = i;
 dots = 0;
 } else if (code === CHAR_DOT && dots !== -1) {
 ++dots;
 } else {
 dots = -1;
 }
 }
 return res;
}
function join() {
 if (arguments.length === 0)
 return '.';
 var sep = arguments[0].indexOf('/') > -1 ? '/' : '\\'
 var joined;
 var firstPart;
 for (var i = 0; i < arguments.length; ++i) {
 var arg = arguments[i];
 if (arg.length > 0) {
 if (joined === undefined)
 joined = firstPart = arg;
 else
 joined += sep + arg;
 }
 }
 if (joined === undefined)
 return '.';
 var needsReplace = true;
 var slashCount = 0;
 if (isPathSeparator(firstPart.charCodeAt(0))) {
 ++slashCount;
 var firstLen = firstPart.length;
 if (firstLen > 1) {
 if (isPathSeparator(firstPart.charCodeAt(1))) {
 ++slashCount;
 if (firstLen > 2) {
 if (isPathSeparator(firstPart.charCodeAt(2)))
 ++slashCount;
 else {
 // We matched a UNC path in the first part
 needsReplace = false;
 }
 }
 }
 }
 }
 if (needsReplace) {
 // Find any more consecutive slashes we need to replace
 for (; slashCount < joined.length; ++slashCount) {
 if (!isPathSeparator(joined.charCodeAt(slashCount)))
 break;
 }
 // Replace the slashes if needed
 if (slashCount >= 2)
 joined = sep + joined.slice(slashCount);
 }
 return normalize(joined);
}

使用:


join('../var/www', '../abc')
> "../var/abc"
join('../var/www', '\abc')
../var/www/abc

总结

以上所述是小编给大家介绍的使用JavaScript实现node.js中的path.join方法,希望对大家有所帮助,如果对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

js 实现node.js 中的path.join方法 node.js 中的path.join方法