前言

Webpack2 中有很多涉及路径参数配置,若不知其所以然,很容易混淆出错。本文尽可能的汇集了 Webpack2 中涉及路径的配置,力争深入浅出。
context
context 是 webpack 编译时的基础目录,入口起点(entry)会相对于此目录查找。
默认值为当前目录,webpack设置 context 默认值代码 可以本地下载:
this.set("context", process.cwd());
process.cwd()即webpack运行所在的目录(等同package.json所在目录)。
context 应该配置为绝对路径,假如入口起点为src/main.js,则可以配置:
{
context: path.resolve('./src'),
entry: './main.js'
}
此时 entry 不能再配置为'./src/main.js',因为 webpack 会相对于 context 配置的 src 目录区查找入口起点(main.js),而 main.js 就在此目录下,所以应当将 entry 配置为当前目录(./)。
context 有什么实际作用?官方文档的解释是使得你的配置独立于工程目录 「This makes your configuration independent from CWD (current working directory)」。怎么理解?举个例子,在分离开发生产配置文件时候,一般把 webpack.config 放到 build 文件夹下,此时 entry 却不用考虑相对于 build 目录来配置,仍然要相对于 context 来配置,这也就是所谓的独立于工程目录。
需要注意的是,output 的配置项和 context 没有关系,但是有些插件的配置项和 context 有关,后面会说明。
output
output.path
打包文件输出的目录,建议配置为绝对路径(相对路径不会报错),默认值和 context 的默认值一样,都是process.cwd()。
除了常规的配置方式,还可以在 path 中用使用 [hash] 模板,比如配置:
output: {
path: path.resolve('./dist/[hash:8]/'),
filename: '[name].js'
}
打包后的目录如下:
这里的 hash 值是编译过程的 hash,如果被打包进来的内容改变了,那么 hash 值也会发生改变。这个可以用于版本回滚。你也可以配置为path.resolve(`./dist/${Date.now()}/`)方便做持续集成等。
ouput.publicPath
记得最开始学习 Webpack 的时候,一直没把 publiPath 理解透彻,甚至还错误的认为它和 output.path 有关联。这个配置项在很多场景是非常重要的,如果不深入理解,就不能灵活运用。
怎么快速又准确的理解 publicPath,我觉得可以用下面的这个公式来表述:
静态资源最终访问路径 = output.publicPath + 资源loader或插件等配置路径
举例说明:
output.publicPath = '/static/'
// 图片 url-loader 配置
{
name: 'img/[name].[ext]'
}
// 那么图片最终的访问路径为
output.publicPath + 'img/[name].[ext]' = '/static/img/[name].[ext]'
// JS output.filename 配置
{
filename: 'js/[name].js'
}
// 那么JS最终访问路径为
output.publicPath + 'js/[name].js' = '/static/js/[name].js'
// CSS
new ExtractTextPlugin("css/style.css")
// 那么最终CSS的访问路径为
output.publicPath + 'css/style.css' = '/static/css/style.css'
publicPath 默认值为空字符串,接下来看其他各种常见的 publicPath 配置的实际意义。
publicPath 设为相对路径,相对路径实际上是相对于index.html的路径,为什么这么说?比如publicPath:"./dist/" ,JS文件名为bundle.js,按上面的公式,最终访问JS的路径为./dist/bundle.js, 这个路径同时也是index.html引用bundle.js的路径,既然要在index.html通过相对路径引用bundle.js,那么index.html的位置就决定了 publicPath 的配置,比如index.html在A文件夹下,而发布的路径不想放到A文件夹里,而是想和A文件夹同级,那么就应配置为publicPath :"../dist/" ,这就是相对于index.html的路径来讲,bundle.js在上一层的dist文件夹里。相对路径的好处是本地可以访问,比如一些混合 APP 用的file协议,用绝对路径肯定是不行的。
publicPath 设为相对于协议url(//)或http地址(http://),比如publicPath:'http://wwww.qinshenxue.com/static/' ,开发环境当然是不能这么干,使用这个的场景是将资源托管到CDN,比如公司的静态资源服务器等。
另外publicPath应该以'/'结尾,同时其他loader或插件的配置不要以'/'开头。
webpack-dev-server
publicPath
上面讲过 webpack 的 publicPath,那么这里的 publicPath 和 上面的publicPath是不是一回事呢?答案是两者区别很大,首先这里的publicPath用于开发环境的,因此不会出现配置 http 地址的情况,那这两者到底有啥区别呢?
我们知道 webpack-dev-server 打包的内容是放在内存中,通过express匹配请求路径,然后读取对应的资源输出。这些资源对外的根目录就是publicPath,可以理解为和 outpu.path 的功能一样,将所有资源放在此目录下,在浏览器可以直接访问此目录下的资源。
但是这个路径仅仅只是为了提供浏览器访问打包资源的功能,webpack中的loader和插件仍然是取ouput.publicPath,比如CSS里面的图片最终的路径仍是"/static/img/xxxx.png",这也是为什么官方推荐 publicPath 和 webpack 配置的保持一致(除了http地址),配置一致才能正常访问其他静态资源。
上面的解释可能还是比较生硬,还是举几个例子来说明:
本例将两处 publicPath 配置成不一样的,这样更容易对比理解。
// webpack.config.js
output: {
path: path.resolve(`./dist/`),
filename: 'js/[name].js',
publicPath: '/static/'
}
// api 调用 webpack-dev-server
var webpack = require('webpack');
var webpackDevServer = require('webpack-dev-server');
var config = require("./webpack.config");
var compiler = webpack(config);
var server = new webpackDevServer(compiler, {
hot: true,
publicPath: '/web/'
});
server.listen(8282, "0.0.0.0")
如何查看 webpack-dev-server 所有启动后的资源访问路径呢?有个简单的方法,就是访问/webpack-dev-server,本例访问截图如下:
上面的资源可以点击查看,你会发现,资源的路径都是/web/*****,所以在index.html中引入JS的路径应为/web/js/main.js,同时也能看到,style.css中的图片路径仍然为/static/img/****.png,而不是/web/。
html-webpack-plugin
这个插件的几处配置受路径配置影响,因此需要专门说明下。
template
template的路径是相对于 output.context,源码如下:
this.options.template = this.getFullTemplatePath(this.options.template, compiler.context);
因此 template 对应的文件需要放在 ouput.context 配置的目录下才能被识别。
filename
filename的路径是相对于 output.path,源码如下:
this.options.filename = path.relative(compiler.options.output.path, filename);
在 webpack-dev-server 中,则相对于 webpack-dev-server 配置的 publicPath。
若 webpack-dev-server 中的 publicPath 和 ouput.publicPath 不一致,在这种配置下使用html-webpack-plugin是有如下问题:
ouput.publicPath 为准,和 webpack-dev-server 提供的资源访问路径不一致,从而不能正常访问;这两个问题也反推出了最方便的配置为:
总结
目前就针对上面基础路径做了简单的解释说明,如有错误,请不吝指出,后续若发现其他相关路径配置,再作补充。
好了,以上就是这文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对的支持。
# webpack
# 路径配置
# webpack2
# 图片路径
# 绝对路径
# webpack常用配置项配置文件介绍
# webpack教程之webpack.config.js配置文件
# vue-cli的webpack模板项目配置文件分析
# webpack引入eslint配置详解
# webpack多入口文件页面打包配置详解
# Vue + Webpack + Vue-loader学习教程之相关配置篇
# 详解vue2.0脚手架的webpack 配置文件分析
# 详解vue-cli + webpack 多页面实例配置优化方法
# 详解webpack之scss和postcss-loader的配置
# webpack配置sass模块的加载的方法
# webpack构建vue项目的详细教程(配置篇)
# 5分钟打造简易高效的webpack常用配置
# webpack配置导致字体图标无法显示的解决方法
# webpack3+React 的配置全解
# 浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
# 详解Webpack + ES6 最新环境搭建与配置
# webpack配置打包后图片路径出错的解决
# webpack高级配置与优化详解
# 相对于
# 默认值
# 放在
# 都是
# 目录下
# 在此
# 如有
# 设为
# 的是
# 本例
# 文件夹里
# 有什么
# 几个
# 好了
# 也会
# 有个
# 本地下载
# 还可以
# 我觉得
# 是有
相关文章:
如何在IIS7上新建站点并设置安全权限?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
如何在阿里云域名上完成建站全流程?
高端网站建设与定制开发一站式解决方案 中企动力
建站之星安全性能如何?防护体系能否抵御黑客入侵?
微信推文制作网站有哪些,怎么做微信推文,急?
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何通过云梦建站系统实现SEO快速优化?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
如何在宝塔面板中创建新站点?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
微课制作网站有哪些,微课网怎么进?
如何选择适配移动端的WAP自助建站平台?
如何挑选高效建站主机与优质域名?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
家具网站制作软件,家具厂怎么跑业务?
制作电商网页,电商供应链怎么做?
建站主机选哪种环境更利于SEO优化?
行程制作网站有哪些,第三方机票电子行程单怎么开?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
孙琪峥织梦建站教程如何优化数据库安全?
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
代刷网站制作软件,别人代刷火车票靠谱吗?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
如何在服务器上三步完成建站并提升流量?
建站主机服务器选购指南:轻量应用与VPS配置解析
网站插件制作软件免费下载,网页视频怎么下到本地插件?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
如何快速搭建个人网站并优化SEO?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
建站之星如何通过成品分离优化网站效率?
建站之星安装提示数据库无法连接如何解决?
如何通过网站建站时间优化SEO与用户体验?
网站制作网站,深圳做网站哪家比较好?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
如何快速搭建响应式可视化网站?
建站之星后台密码遗忘?如何快速找回?
如何快速搭建高效服务器建站系统?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何通过商城免费建站系统源码自定义网站主题?
建站之星会员如何解锁更多建站功能?
Python多线程使用规范_线程安全解析【教程】
网站制作话术技巧,网站推广做的好怎么话术?
盐城做公司网站,江苏电子版退休证办理流程?
*请认真填写需求信息,我们会在24小时内与您取得联系。