You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<!DOCTYPE html><htmllang=""><head><metacharset="utf-8"><metahttp-equiv="X-UA-Compatible" content="IE=edge"><metaname="viewport" content="width=device-width,initial-scale=1.0"><linkrel="icon" href="<%= BASE_URL %>favicon.ico"><title><%= htmlWebpackPlugin.options.title %></title></head><body><noscript><strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><divid="app"></div><!-- built files will be auto injected --></body></html>
getTemplateParameters(compilation,assetsInformationByGroups,assetTags){consttemplateParameters=this.options.templateParameters;if(templateParameters===false){returnPromise.resolve({});}if(typeoftemplateParameters!=="function"&&typeoftemplateParameters!=="object"){thrownewError("templateParameters has to be either a function or an object",);}consttemplateParameterFunction=typeoftemplateParameters==="function"
? // A custom function can overwrite the entire template parameter preparationtemplateParameters
: // If the template parameters is an object merge it with the default values(compilation,assetsInformationByGroups,assetTags,options)=>Object.assign({},templateParametersGenerator(compilation,assetsInformationByGroups,assetTags,options,),templateParameters,);constpreparedAssetTags={headTags: this.prepareAssetTagGroupForRendering(assetTags.headTags),bodyTags: this.prepareAssetTagGroupForRendering(assetTags.bodyTags),};returnPromise.resolve().then(()=>templateParameterFunction(compilation,assetsInformationByGroups,preparedAssetTags,this.options,),);}
// HTML pluginconstresolveClientEnv=require('../util/resolveClientEnv')consthtmlOptions={title: api.service.pkg.name,scriptLoading: 'defer',templateParameters: (compilation,assets,assetTags,pluginOptions)=>{// enhance html-webpack-plugin's built in template paramsreturnObject.assign({compilation: compilation,webpackConfig: compilation.options,htmlWebpackPlugin: {tags: assetTags,files: assets,options: pluginOptions}},resolveClientEnv(options,true/* raw */))}}
可以看到, vue-cli 把 resolveClientEnv(options, true /* raw */)) 方法的返回值合并进了默认变量列表中
vue-cli 生成的工程代码中, public/index.html 通常会是这样:
注意这两句:
我们知道, <%= %> 中包裹的是 HtmlWebpackPlugin 注入进来的变量. 那么
BASE_URL
和htmlWebpackPlugin.options.title
这两个变量是在哪里配置的呢?请看 HtmlWebpackPlugin 生成模板中变量的源码 如下
在生成变量时, 它会找到配置项中的 templateParameters, 如果这个东西是对象, 那么就在生成一堆默认变量后把这个对象合并到生成结果中, 如果这个东西是一个函数, 那么就直接调用这个函数;
如果用户没有配置 templateParameters 呢? 走默认配置, 如下
默认配置是什么呢? 如下:
所以默认情况下, 用户可以从模板中获取到这三个变量:
compilation
,webpackConfig
,htmlWebpackPlugin
如果你传了自定义的 templateParameters, 那么在 html 模板中就只能拿到你的 templateParameters 返回的内容
但是
BASE_URL
又是哪里来的呢?根据 AI 的回答, 这个变量的值是在 vue.config.js 文件中的 publicPath 配置项中设置的。
也就是说, vue-cli 内部偷偷改了 HtmlWebpackPlugin 的 templateParameters 配置, 将 BASE_URL 这个变量合并进了 HtmlWebpackPlugin 默认发回的变量列表中.
请看 vue-cli 相关代码 如下:
可以看到, vue-cli 把
resolveClientEnv(options, true /* raw */))
方法的返回值合并进了默认变量列表中再来看 resolveClientEnv 的代码:
现在真相大白了, 在 vue-cli 生成的项目中, 如果对 HtmlWebpackPlugin 什么都不配, 那么在 index.html 中可用的变量包括 HtmlWebpackPlugin 默认给出的一些变量(包含 htmlWebpackPlugin.options.xxx)和 vue-cli 给出的一些变量(包括 BASE_URL).
The text was updated successfully, but these errors were encountered: