Web开发

首页 » 常识 » 诊断 » Webpack如何配置开发和线上环境
TUhjnbcbe - 2023/6/15 21:38:00

开发环境配置

安装

webpack-dev-server

npminstall-Dwebpack-dev-server

在package.json的scripts中配置命令

{scripts:{"start":"webpack-dev-server--open",}}

为了让我们bundle文件直接注入到默认的html文件中,我们需在配置中引入html-webpack-plugin

npminstall-Dhtml-webpack-plugin

修改配置webpack.config.js,

constHtmlWebpackPlugin=qui(html-webpack-plugin);module.exports={mode:development,entry:{index:./src/main.js,},output:{filename:[name].bundle.js,path:path.solve(__dirname,dist)},devtool:inline-source-map,devServer:{contentBase:./dist},plugins:[newHtmlWebpackPlugin({title:MyApplication}),],}

npmrunstart

启动过后,就可以正常访问项目地址了。

注:这时候会发现它的输出内容默认index.html并不会出现在文件夹中,可以理解为webpack-dev-server是动态的创建内容然后作为结果返回给浏览器的。

常见的一种情况是,可能需要有多个html的入口,比如有登陆页和项目主体页,可能就需要配置多个HtmlWebpackPlugin,你可以这样进行配置,其中chunks中的值跟entrys中对应:

entry:{index:./src/main.js,login:./src/login.js},plugins:{newHtmlWebpackPlugin({file:login.html,chunks:[login],}),newHtmlWebpackPlugin({file:index.html,chunks:[index],}),}

线上环境配置

我们需要在webpack.config.js中配置mode,移除devtool、devServer、HtmlWebpackPlugin

constHtmlWebpackPlugin=qui(html-webpack-plugin);module.exports={mode:production,entry:{index:./src/main.js,},output:{filename:[name].bundle.js,path:path.solve(__dirname,dist)}}

然后在package.json中配置build

{scripts:{"build":"webpack"}}

当然你也可以在开发环境中使用类似的配置,取一个更准确的名字即可

{scripts:{"watch":"webpack--watch"}}

配置多入口的问题

在webpack中,使用HtmlWebpackPlugin对代码进行build常见的一种情形是:你有多个输出的html文件,比如登陆使用

login.html

登陆成功后使用

index.html

。这里的配置和容易出错的情形,看下面的示例配置会有什么问题

不指定chunk和file

output:{path:/build},entry:{index:./src/main.js,login:./src/login.js},plugins:{newHtmlWebpackPlugin({inject:true,template:./public/login.html}),newHtmlWebpackPlugin({inject:true,template:./public/login.html}),}

问题1:

没有指名要将哪个chunk注入到html,结果是两个chunk的引用都会出现在输出的index.html中

问题:

template代表源文件,并不能代表最终生成的文件(需要使用file指定),结果是两个HtmlWebpackPlugin注入了不同模板内容到build/index.html,后者覆盖前者现象是,build/index.html的内容来自于/public/login.html,并且引入的js文件,包含了

login.bundle.js

index.bundle.js

。另外也存在一个

build/login.html

,内容跟

public/login.html

一模一样,猜想是Webpack操作包含了拷贝+inject/写文件,其中从

public/login.html

build/login.html

的拷贝正常,但是inject/写文件操作被错误映射到了

/build/index.html

中。

修改后的配置

output:{path:/build}entry:{index:./src/main.js,login:./src/login.js},plugins:{newHtmlWebpackPlugin({inject:true,template:./public/index.html,file:index.html,chunks:[index]}),newHtmlWebpackPlugin({inject:true,template:./public/login.html,file:login.html,chunks:[login]}),}

chunks也制定了,输出文件也执行了,理论上应该正确了,结果发现/build/index.html和/build/login.html中内容倒是都来自模板了,但是bundle都没有注入。可以把filename和chunks分别注释掉,再进行build,会发现是chunks引起的。我们的代码必然是要使用chunks的,因此找到了绕过它的方式。

曲线救国

首先配置

inject

false

我们再指定打包的

js/css

文件名的时候,不采用

[hash]

,而是直接使用

[name].bundle.js

[name].css

的方式,再在

public/login.html

中和

public/index.html

中引用即将被打包好的css/js即可。

1
查看完整版本: Webpack如何配置开发和线上环境