美文网首页
webpack学习笔记

webpack学习笔记

作者: 爱吃肉的小码哥 | 来源:发表于2019-11-13 15:43 被阅读0次

    1. 基本示例

    先从一个demo开始

    // bar.js
    export default function bar() {
      //
    }
    
    // index.js
    import bar from './bar';
    
    bar();
    
    // webpack.config.js
    const path = require('path');
    
    module.exports = {
      entry: './src/index.js',
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js'
      }
    };
    
    <!doctype html>
    <html>
      <head>
        ...
      </head>
      <body>
        ...
        <script src="dist/bundle.js"></script>
      </body>
    </html>
    

    使用命令webpack打包文件
    也可以在package.jsonscript属性添加"build": "webpack",使用npm run build

    // bundle.js
    !function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";var n;r.r(t),n="haha",console.log(n)}]);
    

    以上是webpack官网的基本示例,具有如下优势

    • 可以模块化(上面采用的是es6 Module)
    • 多个文件的合并,压缩,混淆(bundle.js)

    2. 一个组件和隐式调用

    // src/index.js
    function component() {
      var element = document.createElement('div');
    
      // Lodash(目前通过一个 script 脚本引入)对于执行这一行是必需的
      element.innerHTML = _.join(['Hello', 'webpack'], ' ');
    
      return element;
    }
    
    document.body.appendChild(component());
    
    <!doctype html>
    <html>
      <head>
        <title>起步</title>
        <script src="https://unpkg.com/lodash@4.16.6"></script>
      </head>
      <body>
        <script src="./src/index.js"></script>
      </body>
    </html>
    

    在此示例中,script之间存在隐式依赖关系。index.js 文件执行之前,还依赖于页面中引入的 lodash。之所以说是隐式的是因为 index.js 并未显式声明需要引入 lodash,只是假定推测已经存在一个全局变量 _

    使用这种方式去管理 JavaScript 项目会有一些问题:

    • 无法立即体现,脚本的执行依赖于外部扩展库(external library)。
    • 如果依赖不存在,或者引入顺序错误,应用程序将无法正常运行。
    • 如果依赖被引入但是并没有使用,浏览器将被迫下载无用代码。

    让我们使用 webpack 来管理这些脚本。

    3. 创建一个bundle文件

    要在 index.js 中打包 lodash 依赖,我们需要在本地安装 library

    npm install --save lodash
    
    // src/index.js
    + import _ from 'lodash';
    +
      function component() {
        var element = document.createElement('div');
    
    -   // Lodash, currently included via a script, is required for this line to work
    +   // Lodash, now imported by this script
        element.innerHTML = _.join(['Hello', 'webpack'], ' ');
    
        return element;
      }
    
      document.body.appendChild(component());
    
    // dist/index.html
      <!doctype html>
      <html>
       <head>
         <title>起步</title>
    -    <script src="https://unpkg.com/lodash@4.16.6"></script>
       </head>
       <body>
    -    <script src="./src/index.js"></script>
    +    <script src="main.js"></script>
       </body>
      </html>
    

    index.js显式引入lodash,必须存在并绑定为_(没有全局作用域污染)
    通过声明模块所需的依赖,webpack 能够利用这些信息去构建依赖图,然后使用图生成一个优化过的,会以正确顺序执行的 bundle

    4. 管理资源

    webpack除了javascript还可以通过loader管理图像,css等非js资源
    npm install --save-dev style-loader css-loader

    // webpack.config.js
      const path = require('path');
    
      module.exports = {
        entry: './src/index.js',
        output: {
          filename: 'bundle.js',
          path: path.resolve(__dirname, 'dist')
        },
    +   module: {
    +     rules: [
    +       {
    +         test: /\.css$/,
    +         use: [
    +           'style-loader',
    +           'css-loader'
    +         ]
    +       }
    +     ]
    +   }
      };
    

    源代码中看不见,可以在head标签中查看, css也可以分离,以便在生产环境中节省加载时间

    5. 管理输出

    1. HtmlWebpackPlugin
    2. 清理dist

    相关文章

      网友评论

          本文标题:webpack学习笔记

          本文链接:https://www.haomeiwen.com/subject/vjzhictx.html