使用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 相关文章推荐
你真的了解JavaScript吗?
Feb 24 Javascript
学习jquery之一
Apr 27 Javascript
JS 类型转换常见方法小结
May 31 Javascript
JQuery Study Notes 学习笔记(一)
Aug 04 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
Jan 23 Javascript
JS打开新窗口的2种方式
Apr 18 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
Apr 20 Javascript
浏览器复制插件zeroclipboard使用指南
Mar 26 Javascript
js基于setTimeout与setInterval实现多线程
Jun 17 Javascript
小程序云开发实战小结
Oct 25 Javascript
JavaScript制作3D旋转相册
Aug 02 Javascript
react antd表格中渲染一张或多张图片的实例
Oct 28 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
最省空间的计数器
2006/10/09 PHP
PHP nl2br函数 将换行字符转成 &amp;lt;br&amp;gt;
2009/08/21 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
JS执行删除前的判断代码
2014/02/18 Javascript
js获得页面的高度和宽度的方法
2014/02/23 Javascript
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
js实现一键复制功能
2017/03/16 Javascript
jquery animate动画持续运动的实例
2017/11/29 jQuery
js解决软键盘遮挡输入框的问题分享
2017/12/19 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
2019/06/18 Javascript
更强大的vue ssr实现预取数据的方式
2019/07/19 Javascript
package.json中homepage属性的作用详解
2020/03/11 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
[02:37]2015国际邀请赛选手档案—LGD.Xiao8
2015/07/28 DOTA
win与linux系统中python requests 安装
2016/12/04 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
Python+OpenCv制作证件图片生成器的操作方法
2019/08/21 Python
Python通过Pillow实现图片对比
2020/04/29 Python
为什么称python为胶水语言
2020/06/16 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
2020/07/21 Python
Python使用xpath实现图片爬取
2020/09/16 Python
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
搞笑获奖感言
2014/01/30 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
管理工程专业求职信
2014/08/10 职场文书
2014年信用社工作总结
2014/11/25 职场文书
经理岗位职责范本
2015/04/15 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书