使用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 相关文章推荐
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
Jul 08 Javascript
onbeforeunload与onunload事件异同点总结
Jun 24 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
Sep 11 Javascript
js Calender控件使用详解
Jan 05 Javascript
JavaScript实现横向滑出的多级菜单效果
Oct 09 Javascript
原生js页面滚动延迟加载图片
Dec 20 Javascript
jquery实现列表上下移动功能
Feb 25 Javascript
jQuery Mobile 和 Kendo UI 的比较
May 05 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
Aug 03 Javascript
JavaScript实现Fly Bird小游戏
Dec 15 Javascript
jQuery实现字体颜色渐变效果的方法
Mar 29 jQuery
基于BootStrap的文本编辑器组件Summernote
Oct 27 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
php下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
smarty实现多级分类的方法
2014/12/05 PHP
PHP答题类应用接口实例
2015/02/09 PHP
php把大写命名转换成下划线分割命名
2015/04/27 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
用JavaScript实现UrlEncode和UrlDecode的脚本代码
2008/07/23 Javascript
javascript各种复制代码收集
2008/09/20 Javascript
SOSO地图JS画出标注和中心点以html形式运行
2013/08/09 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
2014/01/26 Javascript
js 删除数组的几种方法小结
2014/02/21 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
Vue.js实现无限加载与分页功能开发
2016/11/03 Javascript
jQuery基于排序功能实现上移、下移的方法
2016/11/26 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
如何在Vue中抽离接口配置文件
2019/10/31 Javascript
Python实现复杂对象转JSON的方法示例
2017/06/22 Python
浅谈python中的数字类型与处理工具
2017/08/02 Python
python timestamp和datetime之间转换详解
2017/12/11 Python
tensorflow 获取变量&amp;打印权值的实例讲解
2018/06/14 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
2019/04/29 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
2020/02/15 Python
基于python3生成标签云代码解析
2020/02/18 Python
使用matplotlib动态刷新指定曲线实例
2020/04/23 Python
Python Http请求json解析库用法解析
2020/11/28 Python
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
柯基袜:Corgi Socks
2017/01/26 全球购物
ECCO爱步加拿大官网:北欧丹麦鞋履及皮具品牌
2017/07/08 全球购物
策划助理岗位职责
2013/11/18 职场文书
员工考核评语大全
2014/04/26 职场文书
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
2022/04/29 Servers