美文网首页
webpack摸爬滚打(一)

webpack摸爬滚打(一)

作者: cirgh | 来源:发表于2018-06-27 18:21 被阅读0次

    整理自官网指南

    版本:webpack 4.*

    安装

    npm install --save-dev webpack
    npm install --save-dev webpack-cli

    起步(基本构建过程)

    新建工程
    npm install webpack webpack-cli --save-dev
    npm init -y
    webpack前

    • 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>
      </body>
    </html>
    
    • src/index.js
    function component() {
      var element = document.createElement('div');
    
      // Lodash(目前通过一个 script 脚本引入)对于执行这一行是必需的
      element.innerHTML = _.join(['Hello', 'webpack'], ' ');
    
      return element;
    }
    
    document.body.appendChild(component());
    
    • 缺点
      • 无法立即体现,脚本的执行依赖于外部扩展库(external library)。
      • 如果依赖不存在,或者引入顺序错误,应用程序将无法正常运行。
      • 如果依赖被引入但是并没有使用,浏览器将被迫下载无用代码。

    使用webpack构建

    • npm install --save lodash
    • webpack.config.js
    const path = require('path');
    
    module.exports = {
      entry: './src/index.js',
      output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
      }
    };
    
    • src/index.js
     import _ from 'lodash';
    ...
    

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

    • 目录结构
    webpack-demo
      |- package.json
    + |- webpack.config.js
      |- /dist
        |- index.html
      |- /src
        |- index.js
    

    将“源”代码(/src)从我们的“分发”代码(/dist)中分离出来。“源”代码是用于书写和编辑的代码。“分发”代码是构建过程产生的代码最小化和优化后的“输出”目录,最终将在浏览器中加载

    管理资源

    webpack ,将动态打包(dynamically bundle)所有依赖项(创建所谓的依赖图(dependency graph))。这是极好的创举,因为现在每个模块都可以_明确表述它自身的依赖,我们将避免打包未使用的模块。

    除了 JavaScript,还可以通过 loader 引入任何其他类型的文件

    加载CSS

    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'
    +         ]
    +       }
    +     ]
    +   }
      };
    

    在项目中添加一个新的 style.css 文件,并将其导入到我们的 index.js
    src/index.js

      import _ from 'lodash';
    + import './style.css';
    
      function component() {
        var element = document.createElement('div');
    
        // lodash 是由当前 script 脚本 import 导入进来的
        element.innerHTML = _.join(['Hello', 'webpack'], ' ');
    +   element.classList.add('hello');
    
        return element;
      }
    
      document.body.appendChild(component());
    

    npm run build

    以这种方式加载资源,可以以更直观的方式将模块和资源组合。无需依赖于含有全部资源的 /assets 目录,而是将资源与代码组合在一起。例如,类似这样的结构会非常有用:

    - |- /assets
    + |– /components
    + |  |– /my-component
    + |  |  |– index.jsx
    + |  |  |– index.css
    + |  |  |– icon.svg
    + |  |  |– img.png
    

    这种配置方式会使你的代码更具备可移植性

    管理输出

    增加一个js文件print.js

    • 目录结构
    webpack-demo
      |- package.json
      |- webpack.config.js
      |- /dist
      |- /src
        |- index.js
    +   |- print.js
      |- /node_modules
    
    • src/print.js
    export default function printMe() {
      console.log('I get called from print.js!');
    }
    
    • src/index.js
      import _ from 'lodash';
    + import printMe from './print.js';
    
      function component() {
        var element = document.createElement('div');
    +   var btn = document.createElement('button');
    
        element.innerHTML = _.join(['Hello', 'webpack'], ' ');
    
    +   btn.innerHTML = 'Click me and check the console!';
    +   btn.onclick = printMe;
    +
    +   element.appendChild(btn);
    
        return element;
      }
    
      document.body.appendChild(component());
    
    • dist/index.html
    <!doctype html>
      <html>
        <head>
    -     <title>Asset Management</title>
    +     <title>Output Management</title>
    +     <script src="./print.bundle.js"></script>
        </head>
        <body>
    -     <script src="./bundle.js"></script>
    +     <script src="./app.bundle.js"></script>
        </body>
      </html>
    
    • webpack.config.js
     const path = require('path');
    
      module.exports = {
    -   entry: './src/index.js',
    +   entry: {
    +     app: './src/index.js',
    +     print: './src/print.js'
    +   },
        output: {
    -     filename: 'bundle.js',
    +     filename: '[name].bundle.js',
          path: path.resolve(__dirname, 'dist')
        }
      };
    

    到目前为止,我们在 index.html 文件中手动引入所有资源,然而随着应用程序增长,并且一旦开始对文件名使用哈希(hash)]并输出多个 bundle,手动地对 index.html 文件进行管理,一切就会变得困难起来。然而,可以通过一些插件,会使这个过程更容易操控。

    HtmlWebpackPlugin
    • npm install --save-dev html-webpack-plugin
    • webpack.config.js
    const path = require('path');
    + const HtmlWebpackPlugin = require('html-webpack-plugin');
    
      module.exports = {
        entry: {
          app: './src/index.js',
          print: './src/print.js'
        },
    +   plugins: [
    +     new HtmlWebpackPlugin({
    +       title: 'Output Management'
    +     })
    +   ],
        output: {
          filename: '[name].bundle.js',
          path: path.resolve(__dirname, 'dist')
        }
      };
    

    HtmlWebpackPlugin 还是会默认生成 index.html 文件。这就是说,它会用新生成的 index.html 文件,把我们的原来的替换, 所有的 bundle 会自动添加到 html 中。

    clean-webpack-plugin:清理 /dist 文件夹

    通常,在每次构建前清理 /dist 文件夹,是比较推荐的做法,因此只会生成用到的文件

    • npm install clean-webpack-plugin --save-dev
    • webpack.config.js
      const path = require('path');
      const HtmlWebpackPlugin = require('html-webpack-plugin');
    + const CleanWebpackPlugin = require('clean-webpack-plugin');
    
      module.exports = {
        entry: {
          app: './src/index.js',
          print: './src/print.js'
        },
        plugins: [
    +     new CleanWebpackPlugin(['dist']),
          new HtmlWebpackPlugin({
            title: 'Output Management'
          })
        ],
        output: {
          filename: '[name].bundle.js',
          path: path.resolve(__dirname, 'dist')
        }
      };
    

    相关文章

      网友评论

          本文标题:webpack摸爬滚打(一)

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