Webpack路径处理:__dirname、path.join与path.resolve详解

Webpack 配置中的路径处理

在 Webpack 配置中,路径处理是构建工具的核心功能之一。path.joinpath.resolve__dirname 是 Node.js 提供的路径处理工具,用于拼接、解析路径和获取当前文件所在目录。理解它们的区别和用途对编写高效的 Webpack 配置至关重要。


__dirname 的基本概念

__dirname 是 Node.js 中的一个全局变量,表示当前执行脚本所在的目录绝对路径。它的值在脚本运行时确定,不会因文件被其他模块引用而改变。

console.log(__dirname);
// 输出:/Users/username/project/src

在 Webpack 配置中,__dirname 常用于指定入口文件、输出目录或其他资源的绝对路径。例如:

module.exports = {
  entry: path.join(__dirname, 'src/index.js'),
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'bundle.js'
  }
};

path.join 的用法

path.join 是 Node.js 的 path 模块提供的方法,用于将多个路径片段拼接成一个完整的路径。它会自动处理路径分隔符(如 /\)并规范化结果。

const path = require('path');
const fullPath = path.join('/foo', 'bar', 'baz');
console.log(fullPath);
// 输出:/foo/bar/baz

在 Webpack 配置中,path.join 通常用于拼接相对路径,确保跨平台兼容性。例如:

module.exports = {
  output: {
    path: path.join(__dirname, 'dist/assets'),
    filename: 'app.js'
  }
};

path.join 的优势在于它会自动处理不同操作系统的路径分隔符,避免手动拼接路径时可能出现的错误。


path.resolve 的用法

path.resolve 也是 path 模块提供的方法,用于将多个路径片段解析为一个绝对路径。它会从右到左依次解析路径,直到生成一个绝对路径为止。如果所有路径片段均为相对路径,则返回当前工作目录的绝对路径。

const path = require('path');
const absolutePath = path
我在学习VUE框架时遇到了vue.config.js,这部分代码有什么用,每部分实现了什么功能:'use strict' const path = require('path') // 引入等比适配插件 const px2rem = require('postcss-px2rem') const postcss = px2rem({ // 基准大小 baseSize,需要和rem.js中相同 // remUnit: 14 代表 1rem = 14px; 所以当你一个14px值时,它会自动转成 (14px/14)rem remUnit: 14 }) function resolve(dir) { return path.join(__dirname, dir) } const CompressionPlugin = require('compression-webpack-plugin') const name = process.env.VUE_APP_TITLE || '皖送智飞' // 网页标题 // const port = process.env.port || process.env.npm_config_port || 80 // 端口 const port = 18181 // 端口 // vue.config.js 配置说明 //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions // 这里只列一部分,具体配置参考文档 module.exports = { // 部署生产环境和开发环境下的URL。 // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上 // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。 publicPath: process.env.NODE_ENV === "staging" ? "/uavWeb" : "/iws/uavWeb1", // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist) outputDir: 'dist', // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下) assetsDir: 'static', // 是否开启eslint保存检测,有效值:ture | false | 'error' lintOnSave: process.env.NODE_ENV === 'development', // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 productionSourceMap: false, // webpack-dev-server 相关配置 devServer: { host: '0.0.0.0', port: port, open: true, proxy: { // detail: https://cli.vuejs.org/config/#devserver-proxy [process.env.VUE_APP_BASE_API]: { // target: `http://localhost:19200`, // target: `http://192.168.3.2:19200`, // target: `http://localhost:19200`, // target: `http://192.168.3.56:19200`, // target: `http://192.168.3.185:19200`, // target: `http://192.168.3.185:19200`, target: `10.145.4.68:19200`, // target: `http://192.168.3.147:19200`, // target: `http://192.168.3.147:19200`, // target: `http://192.168.21.45:19200`, // target: `http://192.168.8.14:19200`, // target: `http://192.168.3.2:19200`, // target: `http://192.168.1.2:19200`, // target: `http://192.168.16.234:19200`, // target: `http://192.168.3.18:19200`, // target: `http://192.168.3.45:19200`, // target: `http://192.168.0.138:19200`, // target: `http://192.168.3.33:19200`, // target: `http://192.168.3.135:19200`, // changeOrigin: true, pathRewrite: { ['^' + process.env.VUE_APP_BASE_API]: '' } }, ["/map3d"]: { // target: "http://192.168.3.185:19198/pointCloud/", //这里填入你要请求的接口的前缀 target: `http://192.168.3.185:19199`, ws: true, //代理websocked changeOrigin: true, //虚拟的站点需要更管origin secure: false, //是否https接口 pathRewrite: { "^/map3d": "/pic", //重写路径 }, }, ["/Mp4"]: { // target: "http://192.168.3.185:19198/pointCloud/", //这里填入你要请求的接口的前缀 target: `http://192.168.3.185:19199`, ws: true, //代理websocked changeOrigin: true, //虚拟的站点需要更管origin secure: false, //是否https接口 pathRewrite: { "^/Mp4": "/mappic", //重写路径 }, }, ["/apiUrl"]: { // target: "http://192.168.3.185:19198/pointCloud/", //这里填入你要请求的接口的前缀 target: `http://192.168.3.185:19199`, ws: true, //代理websocked changeOrigin: true, //虚拟的站点需要更管origin secure: false, //是否https接口 pathRewrite: { "^/apiUrl": "", //重写路径 }, }, }, disableHostCheck: true }, // css: { // loaderOptions: { // sass: { // sassOptions: { outputStyle: "expanded" } // } // } // }, css: { loaderOptions: { less: { javascriptEnabled: true, }, postcss: { plugins: [ postcss, ], }, }, }, configureWebpack: { name: name, resolve: { alias: { '@': resolve('src') } }, module: { rules: [ { test: /\.(glb)$/, loader: "url-loader" } ] }, plugins: [ // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件 new CompressionPlugin({ cache: false, // 不启用文件缓存 test: /\.(js|css|html)?$/i, // 压缩文件格式 filename: '[path].gz[query]', // 压缩后的文件名 algorithm: 'gzip', // 使用gzip压缩 // threshold: 10240, //以字节为单位压缩超过此大小的文件,使用默认值10240吧 minRatio: 0.8 // 压缩率小于1才会压缩 }) ], }, chainWebpack(config) { config.plugins.delete('preload') // TODO: need test config.plugins.delete('prefetch') // TODO: need test // set svg-sprite-loader config.module .rule('svg') .exclude.add(resolve('src/assets/icons')) .end() config.module .rule('icons') .test(/\.svg$/) .include.add(resolve('src/assets/icons')) .end() .use('svg-sprite-loader') .loader('svg-sprite-loader') .options({ symbolId: 'icon-[name]' }) .end() config.when(process.env.NODE_ENV !== 'development', config => { config .plugin('ScriptExtHtmlWebpackPlugin') .after('html') .use('script-ext-html-webpack-plugin', [{ // `runtime` must same as runtimeChunk name. default is `runtime` inline: /runtime\..*\.js$/ }]) .end() config.optimization.splitChunks({ chunks: 'all', cacheGroups: { libs: { name: 'chunk-libs', test: /[\\/]node_modules[\\/]/, priority: 10, chunks: 'initial' // only package third parties that are initially dependent }, elementUI: { name: 'chunk-elementUI', // split elementUI into a single package test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm priority: 20 // the weight needs to be larger than libs and app or it will be packaged into libs or app }, commons: { name: 'chunk-commons', test: resolve('src/components'), // can customize your rules minChunks: 3, // minimum common number priority: 5, reuseExistingChunk: true }, } }) config.optimization.runtimeChunk('single'), { from: path.resolve(__dirname, './public/robots.txt'), //防爬虫文件 to: './' //到根目录下 } }) } }
08-29
// vue.config.js - Vue 2 项目配置文件(基于 webpack) const path = require('path') function resolve(dir) { return path.join(__dirname, dir) } // 根据环境决定 publicPath function publicPath() { if (process.env.NODE_ENV === 'production') { return '././' // 生产环境:相对路径 } else { return '/' // 开发环境:根路径 } } module.exports = { publicPath: publicPath(), // 动态设置资源引用路径 configureWebpack: { resolve: { alias: { '@': resolve('src') // 设置 @ 指向 src 目录 }, fallback: { // 兼容 Node.js 内置模块在浏览器中缺失的问题 path: require.resolve('path-browserify'), fs: require.resolve('browserify-fs'), os: require.resolve('os-browserify/browser'), timers: require.resolve('timers-browserify'), buffer: require.resolve('buffer'), stream: require.resolve('stream-browserify') } } }, lintOnSave: false, // 关闭保存时 ESLint 校验 devServer: { proxy: { '/springbootw12d6cw5': { target: 'http://192.168.1.15:9090/springbootw12d6cw5/', // 后端地址 changeOrigin: true, // 支持跨域 secure: false, // 不校验 HTTPS 证书 pathRewrite: { '^/springbootw12d6cw5': '' // 重写路径:去掉前缀 } } } }, chainWebpack(config) { // SVG 图标处理:将 icons 目录下的 SVG 用 svg-sprite-loader 处理 config.module .rule('svg') .exclude.add(resolve('src/icons')) .end() config.module .rule('icons') .test(/\.svg$/) .include.add(resolve('src/icons')) .end() .use('svg-sprite-loader') .loader('svg-sprite-loader') .options({ symbolId: 'icon-[name]' }) .end() } } worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name _; charset utf-8; # 前端 build 文件夹位置(Windows) root F:/www/myapp; index index.html index.htm; # 【规则1】处理前端 SPA 路由 location / { try_files $uri $uri/ /index.html; } # 【规则2】代理 /springbootw12d6cw5 请求到后端,并重写路径 location /springbootw12d6cw5/ { # 使用 rewrite 去掉前缀,然后代理 rewrite ^/springbootw12d6cw5(.*)$ $1 break; proxy_pass http://192.168.1.15:9090; # 注意没有路径! proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # 错误页面 error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } 外网如何访问我的vue
09-19
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值