webpack开发环境的基本使用,以及处理版本兼容问题,

webpack是什么

  • webpack是一种前端资源构建攻击,一个静态模块打包器

webpack的五个核心概念

  • entry 入口文件
  • output 输出指示(输出到哪里)
  • loader 让webpack处理非javaScript文件
  • plugins 插件,优化打包,压缩
  • mode 配置文件 development 开发环境 production 生产环境

初始化项目

npm init

安装webpack

npm i webpack webpackcli -D

webpack兼容性问题

  • 安装4版本的webpack和3版本的webpack-cli
npm i webpack@4 webpackcli@3 -D

运行webpack

  • 开发环境
webpack ./src/index.js -o ./build/build.js --mode=development 
  • 生产环境
 webpack ./src/index.js -o ./build/build.js --mode=production

webpack能处理js/json资源,不能处理css/img资源

webpack打包资源

内置中间件path.join和path.resolve的区别

  • join是把各个path片段连接在一起, resolve把‘/’当成根目录
  • esolve在传入非/路径时,会自动加上当前目录形成一个绝对路径,而join仅仅用于路径拼接

css\less资源打包

各个包版本推荐

打包命令webpack

创建webpack.config.js:

/*
    webpack配置文件
        作用:指示webpack干哪些活

        所有的构建工具都是基于nodejs平台运行的  模块化采用的common.js

*/
const {
    
    resolve} = require('path');
module.exports ={
    
    
    // webpack配置
    // 入口起点
    entry: './src/index.js',
    // 输出
    output: {
    
    
        filename: 'build.js',
        path: resolve(__dirname, 'build')
    },
    // loader的配置
    module: {
    
    
        rules:[
            // 详细配置loader配置
            {
    
    
                test: /\.css$/,
                // use中的执行顺序  从下到上
                // npm i  [email protected]  [email protected] -D
                use: [
                    // 创建一个style标签将js中的样式资源插入进入
                    'style-loader',
                    // 将css文件变成common.js模块加载js中,里面内容是样式字符串
                    'css-loader'
                ]
            },
            {
    
    
                test: /\.less$/,
                use:[
                    'style-loader',
                    'css-loader',
                    // 将less加载成css文件   [email protected] less  npm i [email protected]
                    'less-loader'
                ]
            }
        ]
    },
    // 插件
    plugins:[

    ],
    // 模式
    mode: 'development' //开发模式
}

打包html资源

各个包版本推荐

/*
    loader 下载 使用
    plugins 下载 引入 使用

*/
const HtmlWebpackPlugin = require('html-webpack-plugin')

plugins:[
        // html-webpack-plugin   [email protected]
        // 作用:创建一个空的html文件 引入打包输出的所有资源(js/css)
        new HtmlWebpackPlugin({
    
    
            // 复制'./src/index.js'  并自动引入打包输出的所有资源
            template : './src/index.html'
        })

],

打包图片资源

用到的包以及对应的版本

注意点:关闭esModule 否则img中的不显示 file-loader不需要引入

webpack.config.js

const {
    
    resolve} = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports ={
    
    
    entry:'./src/index.js',
    output:{
    
    
        filename: 'build.js',
        path: resolve(__dirname,'./build')
    },
    module: {
    
    
        rules: [
            {
    
    
                test: /\.css$/,
                use:[
                    'style-loader',
                    'css-loader',
                ]
            },
            {
    
    
                // 下载两个包 [email protected] [email protected]
                // 问题默认处理不了html中img的图片
                test: /\.(jpg|png|gif)$/,
                loader: 'url-loader',
                options: {
    
    
                    // 图片大小小于8kb,就会被base64处理
                    // 优点:减少请求数量(减轻服务器压力)
                    // 缺点:图片体积会更大(文件速度会更慢)
                    limit: 8 * 1024,
                    // 问题:因为url-loader在默认使用es6模块化解析,而html-loader引入图片是commonjs
                    // 解析时会出现问题:[object Module]
                    // 解决:关闭url-loader的es6模块化,使用commonjs解析
                    esModule: false,
                    // [hash:10]取图片hash的前10位
                    // [ext]取文件原来扩展名
                    name: '[hash:10].[ext]'
                }
                
            },
            {
    
    
                test: /\.html$/,
                // 处理html文件的img图片(负责引入img,从而被url-loader进行处理)[email protected] -D
                loader: 'html-loader',
            }

        ]
    },
    plugins:[
        new HtmlWebpackPlugin({
    
    
            template:'./src/index.html'
        })
    ],
    mode: 'development',
}

打包其他资源

webpack.config.js

module:{
    
    

       .......

            // 打包其他资源(除了html/js/css资源)
            {
    
    
                exclude: /\.(css|js|html)$/,
                loader: 'file-loader',
                options: {
    
    
                    name:'[hash:10].[ext]'
                }
            }
            
        ]
    },

webpack-dev-server 的使用

包的下载

module.exports ={
    
    

    ......

    // 开发服务器 devServer:用来自动化(自动编译,自动打开浏览器,自动刷新浏览器)
    // 特点:没有输出只会在内存中打包,不会有任何输出
    // 启动devServer指令为: [email protected]
    devServer:{
    
    
        contentBase: resolve(__dirname,'build'),
        // 启动gzip压缩
        compress:true,
        // 使用localhost:3000进行查看
        port:'3000',
        // 自动打开浏览器
        open:true,

    }

}

开发环境的完整配置

webpack.config.js

// 开发环境的配置:能让代码运行即可

const {
    
    resolve} = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    
    
    entry: './src/index.js',
    output: {
    
    
        filename: 'build.js',
        path: resolve(__dirname,'build')
    },
    module: {
    
    
        rules: [
            {
    
    
                test: /\.css$/,
                use:[
                    'style-loader',
                    'css-loader',
                ]
            },
            {
    
    
                test: /\.html$/,
                loader: 'html-loader',
            },
            {
    
    
                test: /\.(jpg||png||jpg)$/,
                loader: 'url-loader',
                options: {
    
    
                    limit: 8 * 1024,
                    esModule: false,
                    name:'[hash:10].[ext]'
                }
            },
            {
    
    
                test: /\.less$/,
                use:[
                    'style-loader',
                    'css-loader',
                    'less-loader'
                ]
            },
            {
    
    
                exclude: /\.(html||css||js)/,
                loader: 'file-loader',
                options:{
    
    
                    name:'[hash:10].[ext]'
                }
            }
        ]
    } ,
    plugins:[
        new HtmlWebpackPlugin({
    
    
            template:'./src/index.html'
        })
    ],
    devServer:{
    
    
        contentBase: resolve(__dirname,'build'),
        compress: true,
        port: 3000,
        open: true
    },
    mode: 'development'

}

猜你喜欢

转载自blog.csdn.net/weixin_45822938/article/details/123435660