• 技术文章 >web前端 >js教程

    webpack核心概念之输出(Output)

    青灯夜游青灯夜游2022-08-09 18:45:38转载118
    将所有的资源(assets)归拢在一起后,还需要告诉 webpack 在哪里打包应用程序。webpack 的 output 属性描述了如何处理归拢在一起的代码(bundled code)。下面本篇文章就来带大家深入了解一下webpack核心概念中的输出(Output),希望对大家有所帮助!

    输出(Output):配置 output 选项可以控制 webpack 如何向硬盘写入编译文件。注意,即使可以存在多个入口起点,但只指定一个输出配置

    起步


    我们先npm init初始化一个项目,本地安装webpackwebpack-cli,然后在根目录创建index.htmlwebpack.config.jssrc文件夹,在文件夹内再创建一个main.js作为入口文件

    准备工作完成后如图所示:

    image.png

    main.js

    function Component(){
        var div=document.createElement('div')
        div.innerHTML="来一起学习出口配置吧~"
        return div
    }
    document.body.appendChild(Component())

    index.html

    <body>
        <script src="./dist/bundle.js"></script>
    </body>

    packag.json

    "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1",
      "build":"webpack" //加上
    },

    接下来就是配置部分:webpack.config.js

    输出(Output))


    配置 output 选项可以控制 webpack 如何向硬盘写入编译文件。

    注意,即使可以存在多个入口起点,但只指定一个输出配置

    下面是输出配置的几个概念:

    1、path

    path指定资源输出的位置,要求值必须为绝对路径,如:

    const path=require('path')
    module.exports={
        entry:'./src/main.js',
        output:{
            filename:'bundle.js',
            //将资源输出位置设置为该项目的dist目录
            path: path.resolve(__dirname, 'dist')
        },
    }

    在Webpack 4之后,output.path已经默认为dist目录。除非我们需要更改它,否则不必单独配置,所以如果是webpack4以上,你可以写成:

    module.exports={
        entry:'./src/main.js',
        output:{
            filename:'bundle.js',
        },
    }

    2、filename

    filename的作用是控制输出资源的文件名,其形式为字符串。在这里我把它命名为bundle.js,意为我希望资源输出在一个叫bundle.js的文件中:

    module.exports={
        entry:'./src/main.js',
        output:{
            filename:'bundle.js',
        },
    }

    打包后如图,会自动生成一个dist文件夹,里面有个bundle.js文件

    image.png

    filename可以不仅仅是bundle的名字,还可以是一个相对路径

    即便路径中的目录不存在也没关系,Webpack会在输出资源时创建该目录,比如:

      module.exports = {
        output: {
          filename: './js/bundle.js',
        },
      };

    打包后如图:

    image.png

    在多入口的场景中,我们需要对产生的每个bundle指定不同的名字,Webpack支持使用一种类似模板语言的形式动态地生成文件名

    在此之前,我们再去src中创建一个新的入口文件

    vender.js:

    function Component(){
        var div=document.createElement('div')
        div.innerHTML="我是第二个入口文件"
        return div
    }
    document.body.appendChild(Component())

    webpack.config.js:

    module.exports = {
        entry:{
            main:'./src/main.js',
            vender:'./src/vender.js'
        },
        output: {
          filename: '[name].js',
        },
     };

    打包后如图:

    image.png

    filename中的[name]会被替换为chunk name即main和vender。因此最后会生成vendor.jsmain.js

    此时如果你希望看到内容,你还需在index.html中改下内容,将路径对应上最后打包出来的bundle

    <body>
        <script src="./dist/main.js"></script>
        <script src="./dist/vender.js"></script>
    </body>

    [问题]这时候就会有个需求了,如何让index.html自动帮我们将生成的bundle添加到html中呢?这里可以用到插件 HtmlWebpackPlugin,详细看下方

    3、其他

    除了[name]可以指代chunk name以外,还有其他几种模板变量可以用于filename的配置中:

    它们可以:控制客户端缓存

    [hash][chunkhash]都与chunk内容直接相关,如果在filename中使用,当chunk的内容改变时,可以同时引起资源文件名的更改,从而使用户在下一次请求资源文件时会立即下载新的版本而不会使用本地缓存。

    [query]也可以起到类似的效果,但它与chunk内容无关,要由开发者手动指定。

    4、publicPath

    publicPath是一个非常重要的配置项,用来指定资源的请求位置

    以加载图片为例

    import Img from './img.jpg';
    function component() {
        //...
        var img = new Image();
        myyebo.src = Img //请求url
    	//...
    }
            {
              //...
              query: {
                name: '[name].[ext]',
                outputPath: 'static/img/',
                publicPath: './dist/static/img/'
              }
            }

    由上面的例子所示,原本图片请求的地址是./img.jpg,而在配置上加上publicPath后,实际路径就变成了了./dist/static/img/img.jpg,这样就能从打包后的资源中获取图片了

    publicPath有3种形式:

    应用


    1、单个入口

    在 webpack 中配置 output 属性的最低要求是将它的值设置为一个对象,包括以下两点:

    module.exports={
        entry:'./src/main.js',
        output:{
            filename:'bundle.js',
        },
    }
    //webpack4以后dist会默认生成,于是这里省略了path

    2、多个入口

    如果配置创建了多个单独的 "chunk",则应该使用占位符来确保每个文件具有唯一的名称

    这里用到了上面所讲的filename的[name]

    另外,如果想将这些资源放进指定的文件夹,可以加上path配置

    module.exports={
        entry: {
          main: './src/main.js',
          vender: './src/vender.js'
        },
        output: {
          filename: '[name].js',
          path: __dirname + '/dist/assets' //指定打包后的bundle放在/dist/assets目录下
        }
      }
    // 打包后生成:./dist/assets/main.js, ./dist/assets/vender.js

    HtmlWebpackPlugin


    本章上方遗留的问题可以通过使用插件HtmlWebpackPlugin解决

    安装插件

    npm install --save-dev html-webpack-plugin

    配置插件

    const HtmlWebpackPlugin=require('html-webpack-plugin') //加载模块
    module.exports = {
        entry:{
            main:'./src/main.js',
            vender:'./src/vender.js'
        },
        //添加插件
        plugins:[
            new HtmlWebpackPlugin({
                title:'output management'
            })
        ],
        output: {
          filename: '[name].js',
        },
     };

    打包

    打包完成后你会发现dist中出现了一个新的index.html,上面自动帮我们添加所生成的资源,打开后会发现浏览器会展示出内容

    image.png

    这意味着,以后初始化一个项目就不必写index.html

    源码可从这里获取:

    https://sanhuamao1.coding.net/public/webpack-test/webpack-test/git/files

    更多编程相关知识,请访问:编程视频!!

    以上就是webpack核心概念之输出(Output)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:博客园,如有侵犯,请联系admin@php.cn删除
    专题推荐:Output webpack
    上一篇:深入解析webpack的五个核心概念 下一篇:webpack核心概念之入口配置(entry)
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• webpack打包CSS详细流程解析• webpack处理css浏览器兼容性问题• 深入了解模块打包工具webpack• 深析webpack的打包流程和原理• 深入解析webpack的五个核心概念
    1/1

    PHP中文网