OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

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


分享到


分类 JS学习   关键字 JavaScript   发布 ourjs  1534004685034
注意 转载须保留原文链接,译文链接,作者译者等信息。  
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


社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. Git服务器搭建,多用户组权限控制配置,添加新用户密码登陆
  2. 设置select元素中option的默认值
  3. Node.JS用Path将相对路径转为绝对路径
  4. Office365并不是完全基于JavaScript重写的,只是用来构建UI界面
  5. 用JavaScript将input/textarea中的文本复制粘贴到剪切板
  6. Facebook 正在重构 React Native,将重写大量底层
  7. JavaScript用Number/parseInt/parseFloat判断字符串是否为数字
  8. Node.JS命令行或批处理中更改Linux用户密码
  9. 上海行业工资排名:产品经理一骑绝尘,前端排名第二?
  10. JavaScript中新建一个带全局变量参数的new Function动态函数
  11. 用 OnceAir 搭建个人Git/Svn/照片备份服务器,每年电费7块钱

 相关阅读 - JS学习
  1. JavaScript中新建一个带全局变量参数的new Function动态函数
  2. 设置select元素中option的默认值
  3. JavaScript用Number/parseInt/parseFloat判断字符串是否为数字
  4. 用JavaScript将input/textarea中的文本复制粘贴到剪切板
  5. Node.JS用Path将相对路径转为绝对路径
  6. JS动态滑动切换到页面指定位置
  7. 如何通过网页、客户端、手机APP、路由器查找OnceAir NAS网盘的内网访问地址
  8. JavaScript用new Image实现内网服务器端口扫描
  9. 如何收集捕获Node中的未处理的错误异常信息?
  10. Node.JS循环删除非空文件夹及子目录下的所有文件

 关键字 - JavaScript
  1. 用JavaScript获取当月第一天和最后一天
  2. 用JavaScript测试图像上两点之间的距离
  3. JSON序列化(stringify)对象时排除某些属性的两种方法
  4. 5个现在就该使用的数组Array方法: indexOf/filter/forEach/map/reduce详解
  5. JavaScript运算出现很多小数导致运算不精确的问题,用toFixed解决
  6. 用JavaScript实现node.js中的path.join方法
  7. 如何用CSS将select/option文本居中或居右对齐
  8. JavaScript中新建一个带全局变量参数的new Function动态函数
  9. 设置select元素中option的默认值
  10. 在JavaScript中创建命名空间的几种写法

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号