问题 是否可以在浏览器中使用webpack动态配置`publicPath`?


我有一个项目,我将相同的webpack JS包部署到多个不同的环境。有些环境使用CDN来提供像JS文件这样的静态资产,而有些环境则只使用与项目其余部分相同的根提供静态资产。

这个项目还有多个异步webpack块,所以我定义了一个 publicPath 为他们正确加载。

部署到非cdn时,webpack可以正常配置 publicPath 在我的webpack配置中提供所有类似的东西 /static/

但是,在部署到使用CDN的环境时,这不再适用于异步块,因为webpack将尝试从 /static/ 这意味着他们询问主应用服务器而不是CDN。

很明显,我可以用我的CDN重新构建项目 publicPath 解决这个问题。但是,我更愿意在这两种情况下只使用一个部署包。

我的服务器端应用程序提供了一个javascript全局详细说明了CDN根路径 window.staticCDNRoot。而且这种全局性也出现在非cdn情况下,只是指向应用服务器 - 所以它总是解析到正确的位置来加载静态资产。

有没有什么办法可以让webpack在运行时使用它来这样做 publicPath 变 window.staticCDNRoot + publicPath 没有巨大的hackery?

或者这个问题有更好的解决方案吗?


10953
2017-08-03 21:14


起源

您好@Mike_Driver是否能够在块文件脚本源前生成CDN服务器路径?我试过了 webpack_public_path 但没有运气。在这里看到我的问题 链接 - doorman


答案:


好吧所以我整天都在寻找这个,然后在决定发布之后找到它!

以防万一其他人需要这个:

解决方案是定义 __webpack_public_path__ 在运行时进行生产构建。但要注意不要在开发中使用它,因为它会弄乱模块热负载。

更多信息:

http://webpack.github.io/docs/configuration.html#output-publicpath


10
2017-08-03 21:22



我见过有几个人提到过这个但是没有人上传过一个例子,你可以在输入文件的主旨上以及如何添加变量吗?谢谢 - redroot
您需要做的就是定义全局变量: __webpack_public_path__ 在你的入口点js文件中。所以例如在我的 main.js 我做的事情如下: __webpack_public_path__ = __DEV__ ? '/Development/' : '/Production/';  哪里 __DEV__ 是我在使用时定义的构建过程中的编译时定义选项 webpack.DefinePlugin 但可能是你想要的任何东西。 - Mike Driver
注意 __webpack_public_path__ 必须是一个 自由变量 和 如果定义为全局变量,则不起作用 如 window.__webpack_public_path__。 - Daniel
@Daniel你能举个例子吗?我似乎无法让它工作。 - Sagiv b.g
@ Sag1v即使它可能违反直觉并且你的品牌开始对你大吼大叫,也可以写下这样的东西 __webpack_public_path__ = "http://foo.com/bar/"。做 不 声明变量如下: var __webpack_public_path__ 要么 let __webpack_public_path__。 - Daniel


我可以建议使用插件 https://github.com/agoldis/webpack-require-from 我专门为此目的创建的


0
2018-03-31 07:05