webpack从零到一(1)

使用webpack4+,所以推荐 node版本8.5以上

在webpack中所有文件都被当成模块

初始化package.json

npm init -y

全局安装webpack(开发不推荐使用)

npm install webpack -g

本地安装

npm install webpack webpack-cli -D

  webpack4.0+ 需要安装 webpack-cli 插件,-D 代表 开发的时候使用,发布时不会使用到。

在webpack中所以文件都是模  -js 模块 模块化(AMD CMD es6Module commonjs)

npx webpack  

直接允许webpack,会允许node_modules 对应的bin下的webpack.cmd

webpack 配置

文件名:webpack.config.js

  需要导入的模块

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');//自动打包html到生产目录文件下
const {CleanWebpackPlugin } = require('clean-webpack-plugin');//自动清除文件
const Webpack = require('webpack');
const ExtractTextWebpackPlugin = require('extract-text-webpack-plugin')//抽离成css文件
const cssExtract = new ExtractTextWebpackPlugin('css/index.css')
const css1Extract = new ExtractTextWebpackPlugin('css/main.css')
const PurifycssWebpack = require('purifycss-webpack')//清除多余的样式
const glob = require('glob')//搜索样式
const CopyWebpackPlugin = require('copy-webpack-plugin')//拷贝作用

  

注意:所以配置都是在module.exports = {} 对象内

1 入口及出口文件配置

(1)单文件配置

entry:'./src/index.js',//入口
output:{
  filename:'build.js',
  chunkFilename:'[name].chunk.js',//非html引入的js文件   path:path.resolve('./build') }//出口

  其中filename的属性值,build文件名可以任意名

  (2)引入多个js到同一个html文件中

entry:['index.js',.....]

  entry为数组,即可引入多个js文件

  (3)定义多个入口文件及出口文件

//定义多文件html时,需要使用对象
entry:{
  index:'./src/index.js',
  a:'./src/a.js'
},
output:{
  filename:'[name].[hash:8].js',
  path:path.resolve('./build') 
}

  entry需要为对象类型,属性名为文件名,属性值为目标文件路径

  output对象内,name为entry的属性名

  这里有需要注意的一个点,多个html文件可能会引入不同的js,所以有如下配置

npm install html-webpack-plugin -D
plugins:[
   new HtmlWebpackPlugin({
      filename:'a.html',//html文件名
      template:'./src/index.html'
      title:'哈哈',
      hash:true,
      minify:{
        removeAttributeQuotes:true,//去除属性的双引号
        collapseWhitespace:true//html代码全部在一行
      },
      chunks:['index']//多文件配置,需要引入的js文件
    },
    new HtmlWebpackPlugin({
      filename:'b.html'
      template:'./src/index.html'  
      title:'哈哈',
      hash:true,
      minify:{
        removeAttributeQuotes:true,//去除属性的双引号
        collapseWhitespace:true//html代码全部在一行
      },
      chunks:['a']//多文件配置
    }   
  )
]

  2 开发阶段使用的服务器配置

webpack-dev-server -D
devServer:{
  contentBase:'./build',//服务器开启时默认路径,生成的build是在内存中,若内存没有则找硬盘的文件
  port:3000,//端口号
  compress:true,//压缩服务器
  open:true,//自动打开浏览器
  hot:true//启动热更新
},

  2.1 package.json配置快捷键

“scripts”:{
    "build":"webpack",
    "start":"webpack-dev-server"
}

  现在可使用 npm run dev 或者 npm run build 来开启服务器或者打包文件

  3 支持css等非js模块配置

npm install style-loader css-loader -D
module:{
  rules:[//读取是由右往左写
    {
      test:/.css$/,use:[
        {loader:'style-loader',options:''},
        {loader:'css-loader',
         options:{
         importLoaders:2 //作用:当css文件引用css文件时,可以再加载 postcss-loader等 
          modules:true  //作用:模块化,去除css耦合
         }
      
        }  //有热更新功能       ]     }   ] }

  缺点,所有样式都内联到html中,但是实际上是写入到js文件中。当css样式多时,会造成js文件过大

  所以采用,抽离样式,抽离到css文件,通过css文件引用。有两种插件,推荐使用第一种,如下:

npm install extract-text-webpack-plugin@next -D  //稳定(建议使用)
npm install mini-css-extract-plugin -D      //不太稳定

  (1)抽离为一个文件

module: {
    rules: [{
         test: /.css$/,
         use: ExtractTextWebpackPlugin.extract({
              use: [
                  { loader: 'css-loader' }
              ]
         })
    }]
},
plugins: [
   new ExtractTextWebpackPlugin({
        filename: 'css/index.css'  //抽离出的文件名及路径
   })
]

  (2)抽离为两个文件

const ExtractTextWebpackPlugin = require('extract-text-webpack-plugin')//抽离成css文件
const cssExtract = new ExtractTextWebpackPlugin('css/index.css')
const css1Extract = new ExtractTextWebpackPlugin('css/main.css')
module: {
       rules: [{
           test: /.css$/,
           use: cssExtract.extract({
               use: [
                   { loader: 'css-loader' }
               ]
           })
       }]
 },
plugins: [
        cssExtract,
        css1Extract
]

  缺点,抽离css文件,只是当发布时才使用。如果在开发中,则作用不大,所以使用下列代码段

  (3)禁用抽离,使用内联样式

const ExtractTextWebpackPlugin = require('extract-text-webpack-plugin')//抽离成css文件
const cssExtract = new ExtractTextWebpackPlugin({
   filename:'css/index.css',
   disable:true            
})
module: {
       rules: [{
           test: /.css$/,
           use: cssExtract.extract({
               fallback:'style-loader'
               use: [
                   { loader: 'css-loader' }
               ]
           })
       }]
}    

  3.1 引用css文件时,只调用用到的样式插件

npm i purifycss-webpack purify-css glob -D
const PurifycssWebpack = require('purifycss-webpack')
const glob = require('glob')
plugins:[
   new PurifycssWebpack({
       paths:glob.sync(path.resolve('src/*.html'))   
    })   
]

  注意:使用 new PurifycssWebpack() 时,需要在 HtmlWebpackPlugin() 后面

  3.2 自动在样式添加前缀

npm i postcss-loader autoprefixer -D
module: {
       rules: [{
           test: /.css$/,
           use: cssExtract.extract({
               fallback:'style-loader'
               use: [
                   { loader: 'css-loader' },
                   { loader:'postcss-loader'}
               ]
           })
       }]
}      

    创建 postcss.config.js

module.exports = {
    plugins:[
        require('autoprefixer')
    ]
}

  4 启动热更新配置

plugins:[
  new Webpack.HotModuleReplacementPlugin(),//启动热更新,热更新:只更新一部分。
                    //如不配置,则更新全部,插件,vuex等全部更新并且丢失
]

  在js文件下

if(module.hot){
    module.hot.accept();    //页面更新,则刷新
   module.hot.accept('./a.js',function(){
       /******/
   })  
}

  5 每次运行清除build下的文件配置

npm install clean-webpack-plugin -D
plugins:[
    new CleanWebpackPlugin(),  //清除build文件夹下的文件
]   

  6 拷贝插件

  不打包不压缩,只启动复制的作用

npm i copy-webpack-plugin -D
plugins:[
    new CopyWebpackPlugin([{
          from:'./src/doc',
          to:'public'
    }]
)]

 

 

 

  

 

原文地址:https://www.cnblogs.com/WernerWu/p/11361021.html