使用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 相关文章推荐
js apply/call/caller/callee/bind使用方法与区别分析
Oct 28 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
Apr 01 Javascript
jQuery EasyUI Dialog拖不下来如何解决
Sep 28 Javascript
jquery插件格式实例分析
Jun 16 Javascript
JavaScript中setter和getter方法介绍
Jul 11 Javascript
微信小程序中实现一对多发消息详解及实例代码
Feb 14 Javascript
详解基于Koa2开发微信二维码扫码支付相关流程
May 16 Javascript
vue项目打包部署到服务器的方法示例
Aug 27 Javascript
Angular6 用户自定义标签开发的实现方法
Jan 08 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
Aug 20 Javascript
vue滚动插件better-scroll使用详解
Oct 18 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
Nov 01 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来写记数器(详细介绍)
2006/10/09 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
PHP 错误处理机制
2015/07/06 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
JQuery 操作Javascript对象和数组的工具函数小结
2010/01/22 Javascript
浅谈Javascript事件模拟
2012/06/27 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
2014/03/05 Javascript
学习javascript的闭包,原型,和匿名函数之旅
2015/10/18 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
javascript三种代码注释方法
2016/06/02 Javascript
自制微信公众号一键排版工具
2016/09/22 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
2017/07/28 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
Vue项目history模式下微信分享爬坑总结
2019/03/29 Javascript
详解jQuery中的getAll()和cleanData()
2019/04/15 jQuery
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
原生js实现3D轮播图
2020/03/21 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
2019/10/17 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
Python二维码生成库qrcode安装和使用示例
2014/12/16 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
Python安装whl文件过程图解
2020/02/18 Python
Python3如何判断三角形的类型
2020/04/12 Python
Python基于smtplib协议实现发送邮件
2020/06/03 Python
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
《狼和小羊》教学反思
2014/04/20 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书