前言:node.js对文件的操作, 依赖于自带的文件系统模块(fs), node.js文件按系统中的方法有同步和异步,异步方法的最后一个参数为回调函数,回调函数的第一个参数为错误信息(错误优先),异步方法性能更高,速度更快, 而且没有阻塞。
1.node中的path模块
1. __dirname 总是指向被执行 js 文件的绝对路径
webpack.config.js文件:
console.log(__dirname)
=> /Users/qianyuqianxun/Desktop/zf/vue-menutree
2.__filename 获取当前模块文件的带有完整绝对路径的文件名
webpack.config.js文件:
console.log(__filename)
=> /Users/qianyuqianxun/Desktop/zf/vue-menutree/webpack.config.js
3. path.join() 两个路径的拼接的API
webpack.config.js文件:
console.log(path.join(__dirname,'/src/pages'))
=> /Users/qianyuqianxun/Desktop/zf/vue-menutree/src/pages
4. path.resolve() 看例子
webpack.config.js文件:
path.resolve('/foo/bar', './baz')
=> /foo/bar/baz
path.resolve('/foo/bar', 'baz')
=> /foo/bar/baz
总结:从后往前看,若以 ./ 开头 或者没有符号 则拼接前面路径;
path.resolve('/foo/bar', '/baz')
=> /baz
总结:从后向前,若字符以 / 开头,不会拼接到前面的路径
path.resolve('/foo/bar', '../baz')
=> /foo/baz
总结:若以 ../ 开头,拼接前面的路径,且不含最后一节路径
举栗子:
path.resolve('home')
=> /Users/qianyuqianxun/Desktop/zf/vue-menutree/home
path.resolve('home','/foo/bar', '../baz')
=> /foo/baz
path.resolve('home','./foo/bar', '../baz')
=> /Users/qianyuqianxun/Desktop/zf/vue-menutree/home/foo/baz
path.resolve('home','foo/bar', '../baz')
=>/Users/qianyuqianxun/Desktop/zf/vue-menutree/home/foo/baz
2. require.context()api及应用场景
基本用法
require.context(directory, useSubdirectories = false, regExp = /^\.\//)
- 三个参数:
- directory :要搜索的文件夹路径
- useSubdirectories: 是否搜索文件夹的子目录
- regExp: 匹配文件的正则表达式
require.context()的返回值
- 一个函数,这个函数可以接收一个参数:request,这个request是指在require()语句中的表达式,直接调用该方法可以得到对应模块
- 函数也是对象:该函数有3个属性: resolve, keys, id。resolve:是一个函数,它返回请求被解析后得到的模块 id。keys:也是一个函数,它返回一个数组,由所有可能被上下文模块处理的请求组成。id:是上下文模块里面所包含的模块 id. 它可能在你使用 module.hot.accept 的时候被用到
应用场景:
import Vue from 'vue'
import Vuex from 'vuex'
import getters from './getters'
Vue.use(Vuex)
const modulesFiles = require.context('./modules', true, /\.js$/)
// you donot need `import app from './modules/app'`
// it will auto require all vuex module from modules file
const modules = modulesFiles.keys().reduce((modules, modulePath) => {
// set './app.js' => 'app'
const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
const value = modulesFiles(modulePath)
modules[moduleName] = value.default
return modules
}, {})
console.log('big boss', modules)
const store = new Vuex.Store({
modules,
getters
})
export default store
3. fs模块
resdFile异步读取./test.txt文件中的数据
readFileSync同步读取文件的数据, 容易造成堵塞
let fs = require("fs");
fs.readFile('./test.txt',(err, data)=>{
if(err){
console.log("出错了",err)
}else{
console.log("data",data.toString())
}
})