Webpack的基本使用

142 阅读2分钟

安装

在 node 环境下下载 webpack ,webpack-cli 两个包 webpack使用的是commonJs的规范

核心概念:

入口(entry)

如果传入的一个字符串或字符串数组,chunk会被命名为main。如果传入一个对象,则每个属性key会是chunk的名称,该属性的值描述了chunk的入口

用法:entry:string | [string]

webpack.config.js

//单个入口
module.exports = {
    entry:'xxx.js'
}

也可以配置多个入口

//多个入口
module.exports = {
    entry:['xxx1.js','xxx2.js']
    output:{
    filename:'bundle.js'
}
}

对象语法

用法:entry:{ string | [string]} | {}

如果传入的是一个对象,对象的属性值可以是一个字符串,字符串数组,或者一个描述符(descriptor),描述符语法可以用来传入额外的选项给入口

webpack.config.js

module.exports = {
    entry:{
        app:'xxx1.js',
        adminApp:'xxx2.js',
        //descriptor
        personal:{
            import:'xxx3.js',
            filename:'output1.js',
            //依赖引入
            dependOn:'app',
            //异步chunk
            asyncChunks:true,
        }
    }
}

dependOn

默认情况下,每个入口的chunk保存了全部其用的模块,使用dependOn选项你可以与另一个入口chunk共享模块,上例中personal这个chunk就不会包含app的模块了

\

输出(output)

只能有一个出口

webpack.config.js

module.exports = {
    //出口
    output:{
        //输出文件的名称
        filename:'xxx.js'
        //当多个入口起点的时候就需要借助占位符
        //filenameL:'[name].js'
    }
}
TODO:部分属性的补充
    chunkFilename
    publicPath
    path

默认使用 [id].js 或从 output.filename中推断出的值([name] 会被预先替换为 [id] 或者[id].)

webpack.config.js

output: {
    path: PATHS.output,
    // 生成chunkhash文件,这种格式文件在内容没有改变时候不会更新hash,有利于持久化缓存
    chunkFilename: 'js/[name].[chunkhash:8].chunk.js'
},
    
// 结果可以参考模板的dist/js的文件输出名
​

clean(5.20.0+)

webpack.config.js

output: {
    // 生成输出文件前清除output目录
    clean:true
},
​

filename

此选项决定了每个输出bundle的名称。这些bundle将写入到output.path选项指定的目录下。对于单个入口起点,filename会是一个静态名称。

webpack.config.js

output: {
    filename:'xxxx.js'
},
​

path

目录对应的一个绝对路径

webpack.config.js

const path  = require('path')
module.exports = {
    output:{
        path:path.reslove(__dirname,'dist/assets')
    }
}

publicPath

对于静态资源(图片,文件)和按需加载的资源这个选项很重要,他指定了资源访问的地址,包括CDN地址

webpack.config.js

const path  = require('path')
module.exports = {
    output:{
        path:path.reslove(__dirname,'dist/assets'),
        pubilcPath:'https://cdn.xxx.com/assets/',
    }
}

规则如下:output.path中的URL以HTML页面为基准

loader

loader对模块的源码进行转化,例如TS-JS,less-css,内联图像转换为data URL,在JS模块中import CSS文件

loader的规则就是在require()/import语句中解析test所匹配的正则文件,在webpack编辑器打包之前先用use定义的loader转化一下

webpack.config.js

module.exports = {
    //模块
    module:{
        //规则
        rules:[
            //css文件的规则
            {
                //正则匹配文件名
                test:/.css%/,
                //使用的loader
                use:'css-loader'
            },
            //ts文件的规则
            {
                test:'/.ts$/',
                use:'ts-loader'
            }
        ]
    }
}

提示

1.webpack定义rules时要定义在module.rules
2.test的正则表达式是不需要加引号的,eg. /.txtt$/和"/.txtt$/"前者会去匹配所有的.txt结尾的文件,后者会去匹配具有绝对路径'.txt'的单个文件
3.loader从右到左(或者从下到上)取值和执行(队列形式)

插件(plugin)

插件的目的在于解决loader无法实现的其他事情

本质

webpack插件是一个具有apply方法的JS对象。apply方法会被webpack compiler(webpack编译器)调用,并且在整个编译生命周期都可以访问compiler对象

使用方法

webpack.js

const HtmlWebpackPlugin = require('html-webpack-plugin') //npm安装
​
​
module.exports = {
    entry:'xxx.js',
    output:{
        filename:'my-first-webpack.bundle.js'
        path:path.resolve(__dirname,'dist')
    },
    module:{
        rules:[
            {
                test:/.(js|jsx)$/,
                use:'babel-loader',
            },
        ],
    },
    // 由于插件可以携带参数/选项,你必须在iwebpack的配置中,向plugins属性传入一个new实例
    plugins:[
        new HtmlWebpackPlugin({template:'./src/index.html'})
    ]
}
​
​

HtmlWebpackPlugin将生成一个HTML文件,并在其中使用script引入一个名为my-first-webpack.bundle.js的JS文件