使用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面向对象成果 借国庆发布个最新作品与大家交流
Oct 03 Javascript
IE10中flexigrid无法显示数据的解决方法
Jul 26 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
Oct 30 Javascript
Bootstrap按钮组实例详解
Jul 03 Javascript
node.js 利用流实现读写同步,边读边写的方法
Sep 11 Javascript
浅谈react 同构之样式直出
Nov 07 Javascript
Vue2.0 实现单选互斥的方法
Apr 13 Javascript
javascript判断一个变量是数组还是对象
Apr 10 Javascript
微信小程序开发之左右分栏效果的实例代码
May 20 Javascript
vue实现条件叠加搜索的解决方法
May 28 Javascript
Layui选项卡制作历史浏览记录的方法
Sep 28 Javascript
vue3.0实现插件封装
Dec 14 Vue.js
在小程序中集成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实现模仿socket请求返回页面的方法
2014/11/04 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
2011/03/30 Javascript
19个很有用的 JavaScript库推荐
2011/06/27 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
javascript中常用编程知识
2013/04/08 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
JS 实现点击a标签的时候让其背景更换
2013/10/15 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
深入理解javascript的执行顺序
2014/04/04 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
JavaScript点击按钮后弹出透明浮动层的方法
2015/05/11 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
2015/10/28 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
详解JS正则replace的使用方法
2016/03/06 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
JS使用数组实现的队列功能示例
2019/03/04 Javascript
javascript实现的时间格式加8小时功能示例
2019/06/13 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
Python enumerate索引迭代代码解析
2018/01/19 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
python多线程并发实例及其优化
2019/06/27 Python
Django Rest framework认证组件详细用法
2019/07/25 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
CSS3的first-child选择器实战攻略
2016/04/28 HTML / CSS
文科教师毕业的自我评价
2014/01/16 职场文书