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


Posted in Javascript onAugust 12, 2018

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方法,希望对大家有所帮助,如果对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
jquery 指南/入门基础
Nov 30 Javascript
js下获取div中的数据的原理分析
Apr 07 Javascript
ExtJS 2.0 GridPanel基本表格简明教程
May 25 Javascript
JQuery的Alert消息框插件使用介绍
Oct 09 Javascript
学习并汇集javascript匿名函数
Nov 25 Javascript
Jquery index()方法 获取相应元素索引值
Oct 12 Javascript
无缝滚动js代码通俗易懂(自写)
Jun 19 Javascript
jQuery中$.fn的用法示例介绍
Nov 05 Javascript
javascript中sort()的用法实例分析
Jan 30 Javascript
bootstrap日历插件datetimepicker使用方法
Dec 14 Javascript
jQuery给表格添加分页效果
Mar 02 Javascript
js删除数组中某几项的方法总结
Jan 16 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
Aug 12 #Javascript
Vue实现左右菜单联动实现代码
Aug 12 #Javascript
Vue中的v-for循环key属性注意事项小结
Aug 12 #Javascript
vue实现商品加减计算总价的实例代码
Aug 12 #Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
Aug 12 #Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
Aug 12 #Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
Aug 12 #Javascript
You might like
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
完美利用Yii2微信后台开发的系列总结
2016/07/18 PHP
DOM下的节点属性和操作小结
2009/05/14 Javascript
JavaScript实现QueryString获取GET参数的方法
2013/07/02 Javascript
js实现Select下拉框具有输入功能的方法
2015/02/06 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
javascript实现淘宝幻灯片广告展示效果
2015/04/27 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
javascript实现密码验证
2015/11/10 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
mocha的时序规则讲解
2019/02/16 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
2019/05/22 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
Python 正则表达式(转义问题)
2014/12/15 Python
对numpy 数组和矩阵的乘法的进一步理解
2018/04/04 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
捷克玩具商店:Bambule
2019/02/23 全球购物
印尼购物网站:iLOTTE
2019/10/16 全球购物
土木工程专业个人求职信
2013/12/05 职场文书
机械制造专业毕业生求职信
2014/03/02 职场文书
司仪主持词两篇
2014/03/22 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
2014年保管员工作总结
2014/11/18 职场文书
个人创业事迹材料
2014/12/30 职场文书
美丽人生观后感
2015/06/03 职场文书
致短跑运动员加油稿
2015/07/21 职场文书
创业计划书之服装
2019/10/07 职场文书
基于CSS3画一个iPhone
2021/04/21 HTML / CSS
Golang 正则匹配效率详解
2021/04/25 Golang
Apache POI操作批量导入MySQL数据库
2022/06/21 Servers