webpack实例打包中遇到的问题

实例效果:一个简单的demo

项目结构参考vue-cli文件目录

这里我们需要在打包以后出现两个页面。分别是index.html和linsence.html。所以在根目录下新建了这两个页面。(他们实际上模板页面)

这个demo,我们把src下的main和linsence这两个js文件作为入口文件。

main.js中我们需要引入temp组件中的内容。temp中集成了css样式和html结构,最后打包。

temp.html


<div class="temp-box">
      <h3>关注官方微信</h3>
      <img src="../../asset/1.jpg" alt=""/>               ------------------->这里演示通过src引入图片
</div>

 <div class="bg"></div>                                     ------------------->这里演示通过class通过背景图方式引入图片
----------------------------------------------

temp.css

body,html{background: #ddd}
.temp-box{width:70%;box-shadow: 0 0 3px #000}
-----------------------------------------------

temp.js


import "./temp.css"
import template from "./temp.html"

function Layout(){
  
  return{
      
      name:"模板文件",
      dom:template
  }
}

export default Layout;

-----------------------------------------------

main.js

import Temp from "./components/temp/temp.js"
var app=document.getElementById("app");
var tmp=new Temp();
app.innerHTML=tmp.dom;

-----------------------------------------------

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <p>首页</p>
    <hr>
     <div id="app"></div>

</body>
</html>

 

--------------------------------------------

重点是webpack.config.js文件。

var path=require("path");
var htmlWebpackPlugin=require("html-webpack-plugin");

module.exports={
  
  entry:{
    main:"./src/main.js",
    linsence:"./src/linsence.js"
  },
  output:{
    
    filename:"./js/[name].js",
    path:path.resolve(__dirname,"dist/")
  },
  
  module:{
     
     rules:[
        { 
           test:/\.css$/,
           use:[
              {loader:'style-loader'},
              {loader:'css-loader'},
           ]
        },
        {

           test:/\.html$/,
           use:[
              {loader:'html-loader'}
           ]
        },
        {

          test:/\.(jpg|png|gif)$/,
          use:[
              {
                 loader:"file-loader",
                 options:{
                    name:"[name].[hash].[ext]",
                    outputPath:"./images/"
                 }
              },
          ]
        }
     ]

  },

  plugins:[
    
    new htmlWebpackPlugin({
        template:"./src/main.html",
        filename:"index.html",
        title:"首页",
        chunks:['main'],
        minify:true

    }),
     new htmlWebpackPlugin({
       filename:"lisence.html",
       template:"linsence.html",
       title:"许可证",
       chunks:['linsence'],
       minify:true
    }),

  ]


}

 

遇到的问题和解决办法:

1 如何在打包以后把js文件和html分开,比如js文件最后都出现在js文件夹下。

解决办法:

在output中给filename的路径前面加一个路径js,表示最后打包的js文件在js文件夹下

  output:{
    
    filename:"./js/[name].js",
    path:path.resolve(__dirname,"dist/")
  },

2 多页面打包,为何通过在plugins数组中设置了多个htmlWebpackPlugin对象(多个new htmlWebpackPlugin对象实例 ),但是

最后却还是一个index页面?

解决办法:

需要给每个htmlWebpackPlugin实例指明filename。例如:

   new htmlWebpackPlugin({
        template:"./src/main.html",
        filename:"index.html",
        title:"首页",
        minify:true

    }),
     new htmlWebpackPlugin({
       filename:"lisence.html",
       template:"linsence.html",
       title:"许可证",
       minify:true
    }),

3 多页面打包,为什么所有的页面都引入了entry对象下的js文件。比如我希望index.html打包以后引入的是main.js,lisence.html打包以后引入的lisences.js?现在这两个页面都同时引入了这两个js文件?

解决办法:

需要给htmlWebpackPlugin实例对象设置chunks参数,指明要引入的js文件。例如:

  plugins:[
    
    new htmlWebpackPlugin({
        template:"./src/main.html",
        filename:"index.html",
        title:"首页",
        chunks:['main'],     -------------->mian.html页面打包后只引入main.js
        minify:true

    }),
     new htmlWebpackPlugin({
       filename:"lisence.html",
       template:"linsence.html",
       title:"许可证",
       chunks:['linsence'],   -------------->linsen.html页面打包后只引入linsence.js
       minify:true
    }),

  ]

html-webpack-plugin插件注意点:

(1) 一定要在该插件的实例对象中设置template属性,否则会出现打包以后script引入正常,但是index页面内容全部清空的情况

假设项目下有一个src目录,该目录下有一个main.html页面。我们想以它为模板页面,我们可以修改template属性的值,改成main.html的引用路径。如下:

new htmlPlugin({
          template:"./src/main.html",    //以src目录下的main.html为模板对象 
          filename:"./page/distindex.html",  //output规定了打包后的文件夹为dist,这句表示打包以后的在dist/page下生成名称为distindex.html的页面
          minify:{
           removeComments:true,
           collapseWhitespace:true
          })

(2)chunks的值是引用的js文件的名称,不需要加.js后缀。否则会出现打包以后的index页面无法生成script并且无法引入的情况

 

4:如何把打包以后的图片资源都单独放在一个image文件下?

解决办法:

设置file-loader的outputPath。(注意:file-loader可以,url-loader不能)例如:

module:{
     
     rules:[
        { 
           test:/\.css$/,
           use:[
              {loader:'style-loader'},
              {loader:'css-loader'},
           ]
        },
        {

           test:/\.html$/,
           use:[
              {loader:'html-loader'}
           ]
        },
        {

          test:/\.(jpg|png|gif)$/,
          use:[
              {
                 loader:"file-loader",
                 options:{
                    name:"[name].[hash].[ext]",  -------->这里是打包以后的图片的名称。ext表示图片原本格式
                    outputPath:"./images/"    ----------->注意这里不能写成"/images"
                 }
              },
          ]
        }
     ]

  },


5:在 module:{}配置参数中,如果需要多个loader串联。比如style-loader和css-loader。在4.0+版本中
可以采用如下三种方式:
 module:{
     rules:[
       {
        test:/\.js$/,
        use:{
            loader:"babel-loader"
        },
        exclude:"/node_modules",
        include:"/src/"
      },
      {
        test:/\.css$/,
        loader:"style-loader!css-loader",   =====第二种:use:["style-loader","css-loader"],   =====第三种:loader:["style-loader","css-loader"],
        exclude:"/node_modules",
      }
      ]
  }

6:默认打包以后css是通过style标签内嵌的。如何把打包以后的css通过link标签导入,而不通过style内联的方式?

解决办法:

安装extra-text-webpack-plugin。抽离css。

 npm install extract-text-webpack-plugin@next  

 注意extra-text-webpack-plugin不支持webpack4,通过npm install extract-text-webpack-plugin会报错。

webpack.config.js设置:

 *(1)第一步:引入插件

         var extractTextWebpackPlugin=require("extract-text-webpack-plugin");

 *(2)第二步:在webpack.config.js中修改配置

     module.exports={

            module:{
              rules:[
              { 
                   test:/\.css$/,
                   use:extractTextWebpackPlugin.extract({

                   fallback:"style-loader",   

                   use:'css-loader'

             })
           ]
        },

      }

   * (3)  第三部:在plugins参数中做对应设置:

     plugins:[

           new extractTextWebpackPlugin({
            filename:"main.css"       ------------>filename是最后link进来的css的名称
      })

    ]

注:默认link被抽离的css文件放在dist目录下的。如果想把css文件单独放在css文件夹下。可以设置filename为一个路径

   plugins:[

           new extractTextWebpackPlugin({
            filename:"./css/main.css"       ------------>main.css最终打包以后路径为dist/css/main.css
      })

    ]

7:在开发中,每次打包都需要运行一下webpack命令。比较影响效率。可以通过安装dev-server来实现热启动。打包一次以后,以后每次修改内容,我们只需要保存一下页面就可以自动刷新。

1:安装 webpack-dev-server(如果没有安装webpack-cli需要先安装)

2:需要指定一个路径,我们自动更新在哪个路径里。脚手架一般默认是dist文件夹

3 :在package.json中修改script的配置:

代码如下(--------webpack.config.js-------)

module.exports={

 entry:{...  },

  output:{
      ...
  },
  module:{
      rules:[
              {
                 ...
              },
              {  
              ...

                 })
              }
      ]
  },

  plugins:[...],

  devServer:{

        contentBase:'./dist',

  }

}     

-----------package.json---------

 "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "watch": "webpack--watch",
    "build": "webpack",
    "start": "webpack-dev-server --open"
  },

 

 

 

 

 

      

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值