前言

在没有相关经验的同学,在学习webpack和使用node时,经常会遇到__dirname path.resolve 等,这时往往会一脸懵逼这些都是什么,干嘛的,为什么这些资料和书都完全不提,难道就我不知道 -。-

其实path模块是很常见很通用的。这里我就简单总结一些在项目中经常会用到的方法,帮助大家尽快掌握。

1, 获取规范化的路径/路径/文件名/扩展名

  • 获取规范化的路径:path.normaliz(filepath)
  • 获取路径:path.dirname(filepath)
  • 获取文件名:path.basename(filepath)
  • 获取扩展名:path.extname(filepath)

1.1获取规范化的路径格式

  • path.normalize() 方法会规范化给定的 path,并解析 '..' 和 '.' 片段。
  • 当发现多个连续的路径分隔符时(如 POSIX 上的 / 与 Windows 上的 \ 或 /),它们会被单个的路径分隔符(POSIX 上是 /,Windows 上是 \)替换。 末尾的多个分隔符会被保留。
  • 如果 path 是一个长度为零的字符串,则返回 '.',表示当前工作目录。
path.normalize('C:\\temp\\\\foo\\bar\\..\\');
// 返回: 'C:\\temp\\foo\\'var myPath = path.normalize(__dirname + '/test/a//b//../c/helloWorld.js');
console.log(myPath); //windows: E:\workspace\NodeJS\app\fs\test\a\c\helloWorld.js
复制代码

PS:

  • Windows系统下,'/'和'\'均可以表示路径,但是在网络链接里只能用'/'表示路径。
  • 如果 path 不是一个字符串,则抛出 TypeError。

1.2 获取所在路径

例子如下:

var path = require('path');
var filepath = '/tmp/demo/js/test.js';// 输出:/tmp/demo/js
console.log( path.dirname(filepath) );var myPath = path.dirname(__dirname + '/test/util/helloWorld.js');
console.log(myPath);//Users/cayley/Documents/webpack-demo/test/util
复制代码

__dirname是node.js中的一个全局变量,用来获取当前模块文件所在目录的完整绝对路径

1.3 获取文件名

严格意义上来说,path.basename(filepath) 只是输出路径的最后一部分,并不会判断是否文件名。

但大部分时候,我们可以用它来作为简易的“获取文件名“的方法。

var path = require('path');// 输出:test.js
console.log( path.basename('/tmp/demo/js/test.js') );// 输出:test
console.log( path.basename('/tmp/demo/js/test/') );// 输出:test
console.log( path.basename('/tmp/demo/js/test') );
复制代码

如果只想获取文件名,单不包括文件扩展呢?可以用上第二个参数。

// 输出:test
console.log( path.basename('/tmp/demo/js/test.js', '.js') );
复制代码

1.4 获取文件扩展名

简单的例子如下:

var path = require('path');
var filepath = '/tmp/demo/js/test.js';// 输出:.js
console.log( path.extname(filepath) );
复制代码

更详细的规则是如下:(假设 path.basename(filepath) === B )

  • 从B的最后一个.开始截取,直到最后一个字符。

  • 如果B中不存在.,或者B的第一个字符就是.,那么返回空字符串。

直接看官方文档的例子

path.extname('index.html')
// returns '.html'path.extname('index.coffee.md')
// returns '.md'path.extname('index.')
// returns '.'path.extname('index')
// returns ''path.extname('.index')
// returns ''
复制代码

2, 路径组合

  • path.join([...paths])

  • path.resolve([...paths])

2.1 path.join([...paths])

path.join() 方法使用平台特定的分隔符把全部给定的 path 片段连接到一起,并规范化生成的路径。 长度为零的 path 片段会被忽略。 如果连接后的路径字符串是一个长度为零的字符串,则返回 '.',表示当前工作目录。

参数说明: ...paths <string> 一个路径片段的序列。 返回:

paths拼起来,然后再normalize一下。意思就是会先把路径拼接在一起,然后进行规范化,返回正确的路径。

例子如下:

var path = require('path');// 输出 '/foo/bar/baz/asdf'
path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
复制代码

path定义的伪代码如下:

module.exports.join = function(){var paths = Array.prototye.slice.call(arguments, 0);return this.normalize( paths.join('/') );
};
复制代码

更多例子:

path.join('/foo', 'bar', 'baz/asdf', 'quux', '.');          //  返回 /foo/bar/baz/asdf/quux, "."和"/"没什么影响
path.join('/foo', './bar', 'baz/asdf', '.', 'quux');        //  返回 /foo/bar/baz/asdf/quux
path.join('/foo', './bar', './baz/asdf', 'quux', '..');     //  返回 /foo/bar/baz/asdf
path.join('/foo', 'bar', 'baz/asdf', '.', '.');             //  返回 /foo/bar/baz/asdf
path.join('/foo', 'bar', 'baz/asdf', 'quux');               //  返回 /foo/bar/baz/asdf/quux
path.join('/foo', 'bar', 'baz/asdf', '..', '..');           //  返回 /foo/bar
复制代码

2.2 path.resolve([...paths])

智能解析绝对路径 path.resolve() 方法会把一个路径或路径片段的序列解析为一个绝对路径。层级关系是从左到右的.

规则:
1\. 给定的路径的序列是从右往左被处理的,后面每个 path 被依次解析,直到构造完成一个绝对路径。
2\. 如果处理完全部给定的 path 片段后还未生成一个绝对路径,则当前工作目录会被用上。
3\. 生成的路径是规范化后的,且末尾的斜杠会被删除,除非路径被解析为根目录。
4\. 长度为零的 path 片段会被忽略。
5\. 如果没有传入 path 片段,则 path.resolve() 会返回当前工作目录的绝对路径。
6\. path.resolve将以/开始的路径片段作为根目录,在此之前的路径将会被丢弃,就像是在terminal中使用cd命令一样。而path.join只是简单的将该路径片段进行拼接
复制代码

比如 path.resolve('/foo/bar', './baz') 可以看成下面命令的结果

cd /foo/bar
cd ./baz
复制代码

更多对比例子如下:

var path = require('path');// 假设当前工作路径是 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path
console.log( path.resolve('') )// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path
console.log( path.resolve('.') )// 输出 /foo/bar/baz
console.log( path.resolve('/foo/bar', './baz') );// 输出 /foo/bar/baz
console.log( path.resolve('/foo/bar', './baz/') );// 输出 /tmp/file
console.log( path.resolve('/foo/bar', '/tmp/file/') );// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path/www/js/mod.js
console.log( path.resolve('www', 'js/upload', '../mod.js') );
复制代码

更多例子:

// 当前工作目录与当前文件路径(F:/1/2/task6/test/dist)有区别
path.resolve();                               //  F:/1/2/task6/test 当前工作目录的绝对路径
path.resolve('./a');                          //  F:/1/2/task6/test/a
path.resolve('../a');                         //  F:/1/2/task6/a
path.resolve('.');                            //  F:/1/2/task6/test
path.resolve('..');                           //  F:/1/2/task6
path.resolve('/'));                           //  F:/
path.resolve('./a','../c/d');                 //  F:/1/2/task6/test/c/d
path.resolve('./a','./c/d');                  //  F:/1/2/task6/test/a/c/d
path.resolve('/a','../c/d');                  //  F:c/d
path.resolve('/a','./c/d');                   //  F:/a/c/d
path.resolve('./a','/b','./c/d');             //  F:/b/c/d
path.resolve('a','b','c/d');                  //  F:/1/2/task6/test/a/b/c/d
path.resolve('./a','./b','c/d');              //  F:/1/2/task6/test/a/b/c/d
path.resolve('./a','/b','c/d');               //  F:/b/c/d
path.resolve('./a/b','..','c/d');             //  F:/1/2/task6/test/a/c/d
path.resolve('./a','..','c/d');               //  F:/1/2/task6/test/c/d
复制代码

3, 获取相对路径

接口:path.relative(from, to)

描述:从from路径,到to路径的相对路径。

边界:

  • 如果fromto指向同个路径,那么,返回空字符串。

  • 如果fromto中任一者为空,那么,返回当前工作路径。

上例子:

var path = require('path');var p1 = path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb');
console.log(p1);  // 输出 "../../impl/bbb"var p2 = path.relative('/data/demo', '/data/demo');
console.log(p2);  // 输出 ""var p3 = path.relative('/data/demo', '');
console.log(p3);  // 输出 "../../Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path"
复制代码

参考及感谢

Node入门教程(8)第六章:path 模块详解

转载于:https://juejin.im/post/5cb341596fb9a068553e1818

webpack及node.js基础必会--path模块的常见操作相关推荐

  1. 360前端星计划--Node.js 基础入门

    01 什么是 Node.js Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. https://node ...

  2. node.js 基础知识

    前言:这篇博客是跟着黑马程序员的 node.js 入门课程写下的. 链接地址: b站黑马程序员node.js课程 结合自己的理解,做了部分补充,可放心食用. 以下是正文: 黑马程序员nodejs 入门 ...

  3. node.js基础学习

    node.js简介 Node.js能够让javascript在服务端运行 1.node的特性 异步I/O 说到异步I/O,就不得不说一下I/O,他们分别是input和output的缩写,也就是输入.输 ...

  4. 01慕课网《进击Node.js基础(一)》Node.js安装,创建例子

    版本:偶数位为稳定版本,基数为非稳定版本 - 0.6.x - 0.7.x    - 0.8.x -0.9.x    -0.10.x  -0.11.x 概念:Node.js采用谷歌浏览器的V8引擎,用C ...

  5. 前端工程化----Node.js基础篇

    文章目录 1.认识Node.js Node.js是什么 Node.js应用场景 2.Node.js安装和版本管理 Node.js安装 Node.js版本工具 3.Node.js执行文件 4.Node. ...

  6. Node.js基础使用

    Node.js基础使用 1. vs code 里面如何切换自定义终端? Ctrl+Shift+p 打开命令面板 搜索shell 找到:终端 选择默认Shell进行更改 2. 浏览器 vs node 异 ...

  7. Node.js基础笔记

    Node.js基础笔记 1. NodeJS入门基础 1.1 NodeJS 介绍 1.1.1 NodeJS 是什么 1.1.2 NodeJS 的优势 1.1.3 NodeJS 的技术特性 1.1.4 N ...

  8. Node.js(一、Node.js基础、模块加载机制、包等)

    Node.js(一.Node.js基础.模块加载机制.包等) 1.Node.js基础 1.1.Node是什么 1.2.Node环境安装失败解决方法 1.2.1.Node环境搭建 1.2.2.错误代码2 ...

  9. 构建node.js基础镜像_我如何使用Node.js构建工作抓取网络应用

    构建node.js基础镜像 by Oyetoke Tobi Emmanuel 由Oyetoke Tobi Emmanuel 我如何使用Node.js构建工作抓取网络应用 (How I built a ...

最新文章

  1. django项目用 setuptools打包构建(待更新)
  2. PHP json_encode() 函数介绍
  3. java 事件监听器是组件_JavaWeb的三大组件之事件监听组件(Listener)
  4. 2017-9-15-Linux移植:WinSCP软件 SSH Server开启
  5. spring boot系列 1: 第一个spring boot: Hello prj
  6. 总结1:Ajax上传图片至阿里云服务器
  7. python语言中整型对应的英文_Python基本数据类型详细介绍(转)
  8. 【比较】CWebBrowser2类Navigate方法的一些问题
  9. css 右上角 翻开动画_css制作电闪雷鸣的天气图标
  10. @autowired注解注入为null_Java面试必备:依赖注入注解@Resource和@Autowired
  11. 分治算法-最大子数组问题
  12. 在前端团队的那些日子(初见)
  13. 【分治】LeetCode 50. Pow(x, n)
  14. 浪潮工程师窃取公司CPU、硬盘在咸鱼挂卖被阿里发现,判处有期徒刑3年3个月...
  15. argument 1 must be str, not PosixPath
  16. unity打印生成之后的条形码(二维码也行)
  17. [ vulhub漏洞复现篇 ] Tiki Wiki CMS Groupware 认证绕过漏洞CVE-2020-15906
  18. PMP考试中的各种图总结
  19. 《金匮要略》试卷二(A)
  20. 如何用计算机蓝牙放音乐,Win7系统如何设置使用蓝牙听歌

热门文章

  1. 通過腳本實現zabbix的安裝
  2. OGEngine引擎开发slot 手游强势来袭
  3. C#中MySQL数据库的备份 还原 初始化
  4. 李洪强iOS开发Swift篇—02_变量和常量
  5. 百度 合肥地区 软件研发工程师 笔试题
  6. 深度剖析WinPcap之(二)——网络分析与嗅探的基础知识(4)
  7. 如何在后台配置中找到某个具体配置的事务码
  8. LeetCode-MySQL-175. 组合两个表
  9. Go进阶:如何开发多彩动感的终端UI应用
  10. 使用Docker高效搭建开发环境