webpack4配置中的 publicPath和contentBase

1.在webpack.config.js配置中的两个publicPath和一个contentBase

const { resolve } = require('path')
module.exports={
    output: {
        path: resolve(__dirname, './dist'),
        filename: 'main.js',
        publicPath:'./'
    },
    devServer: {
        contentBase: './src',
        publicPath:'/',
        port: 3000,// 端口号
        open: true,// 自动打开浏览器
    }

2.output中的publicPath

官方文档:对于按需加载(on-demand-load)或加载外部资源(external resources)(如图片、文件等)来说,output.publicPath 是很重要的选项。如果指定了一个错误的值,则在加载这些资源时会收到 404 错误。该选项的值是以 runtime(运行时) 或 loader(载入时) 所创建的每个 URL 为前缀。有时必须用到,例如:当将资源托管到 CDN 时。此选项的值都会以/结束

通俗的说也就是影响资源生文件的引入路径

只有我们在文件中使用相对路径引入文件时,这个值会影响最后文件的引入路径,当文件以http或者hhtps路径开头时,是不会影响打包后的文件路径(webpack 可能做了优化)。

如果设置了publicPath=‘./’ 或者publicPath='/' 或者publicPath='/test/' 

比如我们源码中引入<link rel="stylesheet" hpuref="index.css">

配置                                       打包后:

publicPath=‘./’        ---->        <link rel="stylesheet" href="./index.css">

publicPath='/'         ---->       <link rel="stylesheet" href="/index.css">

publicPath='/test/'  ---->       <link rel="stylesheet" href="/test/index.css">

2.webpack-dev-server 中配置的 publicPath

 webpack-dev-serve会在内存中保存一份打包后的文件,publicPath映射的资源就是内存的根目录或者说是内存中的文件,比如我们本地服务运行在 http:localhost:3000,publicPath='/a'。

源码目录:

打包后生成的文件:

运行npx webpack-dev-serve后控制台是这样的

绿色的即是内存中的文件,可以想象成内存中有这样一个打包后文件目录,且和打包的文件夹dist内容是一样的

当我们去访问http:localhost:3000/a/ 时,它会去内存中查找 ,此时会显示出index.html的内容。注意是http:localhost:3000/a/,不是http:localhost:3000/a

3.关于 webpack-dev-serve中的contentBase

官方文档:告诉服务器从哪里提供内容。只有在你想要提供静态文件时才需要。devServer.publicPath 将用于确定应该从哪里提供 bundle,并且此选项优先

通俗的讲就是,contentBase访问的不是内存中的文件,而是我们本地真实存在的。

比如我们的配置是下面这样的,目录结构如上

 devServer: {

        contentBase: './',

        publicPath:'/a',

        port: 3000,

        open: true

    },

当我们去访问http:localhost:3000,页面是这样的

当我们去访问http:localhost:3000/a/,它会去内存中查找 ,此时会显示出index.html的内容.

devServer.publicPath优先于devServer.contentBase的意思:当devServer.publicPath = ‘/’ 时,我们默认打开http:localhost:3000地址,此时就会直接加载内存中的资源,即使设置了contentBase也是无效的。

如果我们的配置是这样的:

 devServer: {

        contentBase: './src',

        publicPath:'/',

        port: 3000,

        open: true

    },

在输入地址栏输入http:localhost:3000它会去内存中查找 ,此时会显示出index.html的内容

但是输入http:localhost:3000/src则是下面这样的

但是如果devServer.publicPath不是‘/’ 时,或者不写则http:localhost:3000作为本地src文件夹的根目录

 devServer: {

        contentBase: './src',

        publicPath:'/a',

        port: 3000,

        open: true

    }

devServer: {

        contentBase: './src',

        port: 3000,

        open: true

    },

输入http:localhost:3000,如下所示

总结:

output.publicPath :影响资源生成路径和文件的引入路径

devServer.publicPath :设置内存中资源的访问地址,当我们修改本地代码时会重新编译,替换掉内存中原来的文件

devServer.contentBase:设置访问本地资源的目录

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值