使用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 相关文章推荐
jQuery 标题的自动翻转实现代码
Oct 14 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
Mar 18 Javascript
EditPlus注册码生成器(js代码实现)
Mar 25 Javascript
javaScript的函数对象的声明详解
Feb 06 Javascript
Angular JS数据的双向绑定详解及实例
Dec 31 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
Apr 13 Javascript
jquery请求servlet实现ajax异步请求的示例
Jun 03 jQuery
vue2.0学习之axios的封装与vuex介绍
May 28 Javascript
浅谈webpack SplitChunksPlugin实用指南
Sep 17 Javascript
layui递归实现动态左侧菜单
Jul 26 Javascript
解决axios post 后端无法接收数据的问题
Oct 29 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
Dec 10 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 和 MySQL 基础教程(四)
2006/10/09 PHP
php中大括号作用介绍
2012/03/22 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
PHP检测链接是否存在的代码实例分享
2016/05/06 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
Jquery调用webService远程访问出错的解决方法
2010/05/21 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
Javascript数组操作函数总结
2015/02/05 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
Webpack实现按需打包Lodash的几种方法详解
2017/05/08 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
浅谈python可视化包Bokeh
2018/02/07 Python
python使用itchat实现手机控制电脑
2018/02/22 Python
python的pip安装以及使用教程
2018/09/18 Python
Python常见数据类型转换操作示例
2019/05/08 Python
python爬虫库scrapy简单使用实例详解
2020/02/10 Python
Python3爬虫带上cookie的实例代码
2020/07/28 Python
python爬虫要用到的库总结
2020/07/28 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
汽车检测与维修应届毕业生求职信
2013/10/19 职场文书
就业推荐表自我鉴定
2013/10/29 职场文书
《翻越远方的大山》教学反思
2014/04/13 职场文书
党的群众路线教育实践活动对照检查剖析材料
2014/10/09 职场文书
学校工会工作总结2015
2015/05/19 职场文书
新生开学寄语大全
2015/05/28 职场文书
股东出资协议书
2016/03/21 职场文书
创业计划书之酒吧
2019/12/02 职场文书
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
详细分析PHP7与PHP5区别
2021/06/26 PHP