Webpack中的路径

webpack中涉及许多路径参数的配置。在此做个整理。

context

context是webpack编译时的基础目录,entry入口会相对于此目录查找。

若不配置,默认值是当前目录,webpack设置context、默认值代码:

this.set("context", process.cwd());

即webpack运行所在目录。

context应该是绝对路径,假设入口是src/main.js,则可以设置

{

context: path.resolve("./src")

entry: "./main.js"

}

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()}`)方便做持续集成等。

output.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配置的实际意义

1.相对路径,实际上是相对于index.html。因为最终bundle.js是在index.html中通过相对路径引入。

相对路径的好处是本地可以访问,在一些混合app用的file协议,用绝对路径是不行的。

2.相对于url(//)或http地址(http://),使用此场景是将资源托管到CDN,比如公司的静态资源服务器等。

另外,publicPath应该以‘/‘结尾,同时其他loader或插件的配置不要以‘/‘开头。

webpack-dev-server

1.publicPath

这里的publicPath是用于开发环境,不会出现配置http地址的情况。

wds打包的内容是放在内存汇总,通过express匹配请求路径,然后读取对应的资源输出。

这些资源对外的根目录是publicPath,可以理解和output.path的功能一样,将所有资源放在此目录下,

在浏览器可以直接访问此目录下的资源。但是这个路径仅仅只是为了提供浏览器访问打包资源的功能,

webpack中的loader和插件仍然是取output.publicPath,比如CSS里面的图片最终的路径是"/static/img/xxx.png",

这也说为什么官方推荐publicPath和webpack配置的保持一致(除了http地址),配置一致菜鸟正常访问其他静态资源。

举例说明:

//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

html-webpack-plugin

这个插件的几处配置受路径配置影响。

template

template的路径是相对于output.context,源码如下:

this.optiobns.template = this.getFullTemplatePath(this.options.template, compiler.context);

因此template对应的文件需要放在output.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 提供的资源访问路径不一致,从而不能正常访问;
  • 浏览 index.html 需要加上 webpack-dev-server 配置的 publicPath 才能访问(http://localhost:8282/web/)。

这两个问题也反推出了最方便的配置为:

    • ouput.publicPath 和 webpack-dev-server 的publicPath 均配置为‘/‘,vue-cli 就是这种配置
    • template 放在根目录,html-webpack-plugin 不用修改参数的路径,filename 采用默认值。
时间: 2024-10-07 19:54:36

Webpack中的路径的相关文章

透过现象看webpack处理css文件中图片路径转换的具体过程

webpack是目前使用比较流行的一个前端模块打包器,前端的任何资源都被当成一个模块来处理,如图片.css文件等等.在基于webpack构建的前端项目中,一般都会配置有关css文件处理的规则,这其中也包括css文件中图片资源的处理,那么webpack到底是怎么处理它的呢?笔者之前也遇到过类似图片路劲的问题,为此还写过一篇博文webpack生成的css文件background-image url图片无法加载.今天就来说说webpack是怎么处理css文件中的图片路径的,首先上一个具体的例子. 一个

webpack图片的路径与打包

转的http://www.cnblogs.com/ghost-xyx/p/5812902.html 今天写 react遇到打包图片,之前都是通过url在css里,没遇到问题,今天在 react里直接用就错了,所以记录下来,这篇文章帮我解决了... 刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不能打包进我们的目标文件夹里(bundle).下面我们就来分析下在webpack项目中图片的应用场景. 在实际生产中有以下几种图片的引用方式: 1. HTM

vue项目中的路径别名

每次写引入组件的路径,如果路径嵌套比较深,那么会比较麻烦,我们可以在webpack.base.conf.js,中设置路径的别名,默认webpack设置src的别名为@ 建议配置src下一级目录的别名,这样可以减少重复书写也会比较美观, 这样在引入components中的文件就可以这样写了: 代替 在项目运行中修改,路径别名配置需要重启项目,执行 cnpm install --save

在webpack中配置vue.js

在webpack中配置vue.js 这里有两种在webpack中配置vue.js的方法,如下: 1.在main.js中引入vue的包: index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,

webpack中的加载器

通过loader打包非js模块 在实际开发过程中,webpack 默认只能打包处理以.js 后缀名结尾的模块,其他非.js 后缀名结 尾的模块,webpack默认处理不,需要调用loader加载器才可以正常打包,否则会报错! loader加载器可以协助webpack打包处理特定的文件模块,比如: less-loader可以打包处理 .less相关的文件 sass-loader可以打包处理 .scss相关的文件 url-loader可以打包处理css中与url路径相关的文件 loader的调用过程

webpack中的~

比如我们可以看到一些css文件中有这样的代码: @import '~antd/dist/antd.css';... 那么,这个 ~ 起什么作用呢? 首先,我们来看一下URL转换规则 1.如果URL是一个绝对路径(例如 /images/foo.png),它将会保留不变. 2.如果URL以 . 开头,它会作为一个相对模块请求被解析且基于你的文件系统中的目录结构进行解析. 3.如果URL以 ~ 开头,其后任何的内容都会作为一个模块请求被解析.这意味着你甚至可以引用node模块中的资源: <img sr

【04-10】java中的路径

java中的路径 System.getProperty("user.dir")  获取工程的绝对路径 Class.class.getClass().getResource("/").getPath()  类的绝对路径 jsp中的路径 request.getRequestURI() 得到相对地址 request.getRequestURL()  得到地址栏地址 request.getContextPath() 得到工程名 request.getServletPath(

理解java Web项目中的路径问题

本文以项目部署在tomcat服务器为例,其他相信也是一样的. 先说明请求页面的写法,在web中,页面路径主要写的有以下几种 1.请求重定向 2.浏览器的请求被服务器请求到新页面(我称为“转发”) 3.超链接 4.form表单提交的action 为了演示路径写法,首先先建一个项目(项目名WebPath),并建立一个servlet(PathServlet) 目录结构如下 以访问目录中index.jsp文件为例,jxf.path.PathServlet.jave中对以上四种路径的写法(红色部分) 1

升级CUDA版本导致VS2010错误:未找到导入的项目XXX,请确认&lt;Import&gt;声明中的路径正确,且磁盘上存在该文件。。。。

VS2010错误:未找到导入的项目XXX,请确认<Import>声明中的路径正确,且磁盘上存在该文件. E:\IGSNRR\dev\PhDThesisCode_CUDA\gtcg\gtcg.vcxproj : error : 未找到导入的项目“C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\CUDA 5.5.props”.请确认 <Import> 声明中的路径正确,且磁盘上存在该文件. E: