zoukankan      html  css  js  c++  java
  • webpack从入门到放弃

    安装

    由于webpack依赖node环境,所以在安装webpack之前需要先安装Node!

    Node下载地址

    这里我就使用局部方法安装webpage 3.6.0版本,如下:

    npm install --save-dev webpack@3.6.0
    node_modules/.bin/webpack -v    //查看版本
    npm init    //初始化项目
    

    然后新建src、dist文件夹与index.html文件,并在src文件夹里新建main.js、math.js,如下图所示:

    打包命令如下:

    node_modules/.bin/webpack ./src/main.js ./dist/bundle.js
    

    打包

    配置webpack.config.js文件来便捷命令打包

    在根目录创建名为webpack.config.js的文件

    内容如下:

    const path = require('path')
    
    module.exports = {
      entry: './src/main.js',
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js'
      }
    }
    

    然后直接输入以下命令即可完成打包:

    node_modules/.bin/webpack
    

    配置package.json文件来便捷命令打包

    在package.json中添加如下代码:

      "scripts": {
        "test": "echo "Error: no test specified" && exit 1",
    +   "build": "webpack"
      },
    

    然后输入以下命令即可完成打包:

    npm run build
    

    loaders

    处理CSS文件

    安装css-loader、style-loader模块

    npm install --save-dev css-loader
    npm install style-loader --save-dev
    

    编辑main.js文件,添加如下代码:

    require('./css/normal.css')   // 依赖css文件
    

    编辑webpack.config.js文件,添加如下代码:

    module: {
        rules: [
          {
            test: /.css$/,
            // 多个loader时,从右向左读取
            use: ['style-loader', 'css-loader']
          }
        ]
      }
    

    然后执行npm run build即可!

    处理less文件

    安装less-loader模块

    npm install --save-dev less-loader less
    

    编辑main.js文件,并在末尾添加如下代码:

    require('./css/special.less')   // 依赖less文件
    

    编辑webpack.config.js文件,添加如下代码:

    module: {
        rules: [
          {
            test: /.css$/,
            // 多个loader时,从右向左读取
            use: ['style-loader', 'css-loader']
          },
    +     {
    +       test: /.less$/,
    +       use: [{
    +         loader: "style-loader"
    +       }, {
    +         loader: "css-loader"
    +       }, {
    +         loader: "less-loader"
    +       }]
    +     }
        ]
      }
    

    然后执行npm run build即可!

    加载和转译sass/scss文件同理,参考地址:webpack loader 样式

    处理图片文件

    安装url-loader模块

    npm install --save-dev url-loader
    

    编辑webpack.config.js文件,添加如下代码:

    {
      test: /.(png|jpg|gif)$/,
      use: [
        {
          loader: 'url-loader',
          options: {
            limit: 30000
          }
        }
      ]
    }
    

    加载图片时,如果图片大小×1024小于limit,图片将编译成base64字符串形式

    如果图片大小×1024大于limit,此时需要使用模块file-loader,步骤如下:

    安装file-loader模块

    npm install --save-dev file-loader
    

    安装完成后,执行build后会发现并没有生效,是因为打包后图片路径问题,需要编辑webpack.config.js文件,添加一行如下代码即可解决:

    module.exports = {
      entry: './src/main.js',
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js',
    +   publicPath: './dist/'
      },
    

    打包完成后,我们又发现打包后的图片是直接存储在dist文件夹下的,图片名也是杂乱的,这样很不利于后期的维护与开发,因此需要将图片打包存储在dist/img/文件夹下,并且将图片文件名更改为易懂的名字!!

    编辑webpack.config.js文件,添加如下代码:

    {
      test: /.(png|jpg|gif)$/,
      use: [
        {
          loader: 'url-loader',
          options: {
            limit: 30000,
    +       name: 'img/[name].[hash:8].[ext]'
          }
        }
      ]
    }
    

    最后我们可以看到项目的目录是这样的:

    使用babel来实现ES6转ES5

    安装babel-loader、babel-core、babel-preset-env模块

    npm install --save-dev babel-loader@7 babel-core babel-preset-es2015
    

    编辑webpack.config.js文件,添加如下代码:

    module: {
      rules: [
        {
          test: /.js$/,
          exclude: /(node_modules|bower_components)/,
          use: {
            loader: 'babel-loader',
            options: {
              presets: ['es2015']
            }
          }
        }
      ]
    }
    

    最后执行npm run build即可!

    Vue

    使用并配置Vue

    安装vue

    npm install --save vue
    

    然后在main.js里添加如下测试代码:

    import Vue from 'vue'
    const app = new Vue({
      el: '#app',
      data: {
        message: 'hello vue'
      }
    })
    

    并在html添加如下代码:

    <div id="app">
      <h2>hello world</h2>
      <h2>{{message}}</h2>
    </div>
    

    打包后会发现页面没有任何显示,打开控制台后发现如下报错:

    [Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.
    

    解决办法:

    编辑webpack.config.js文件,添加如下代码:

    module.exports = {
       entry: './src/main.js',
       output: {...
       },
       module: {...
       },
    +  resolve: {
    +    alias: {
    +      'vue$': 'vue/dist/vue.esm.js'
    +    }
    +  }
    }
    

    最后执行npm run build即可!

    处理.vue文件

    安装vue-loader、vue-template-compiler模块

    npm install --save-dev vue-loader vue-template-compiler
    

    编辑webpack.config.js文件,添加如下代码:

    module: {
      rules: [
    +     {
    +       test: /.vue$/,
    +       use: ['vue-loader']
    +     }
      ]
    }
    

    在main.js中添加如下代码:

    import Vue from 'vue'
    import App from './vue/App.vue'
    
    new Vue({
      el: '#app',
      template: "<App></App>",
      components: {
        App
      }
    })
    

    新建src/vue/App.vue文件,目录结构如下:

    编辑App.vue文件,添加如下代码:

    <template>
      <div>
        <h2 class="color">hello world</h2>
        <button>按钮</button>
        <h2>{{message}}</h2>
      </div>
    </template>
    
    <script>
    export default {
      name: "App",
      data() {
        return {
          message: "hello vue!!!"
        };
      }
    };
    </script>
    
    <style scoped>
    .color {
      color: orange;
    }
    </style>
    

    执行npm run build后会发现报错,报错信息大概如下:

    vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin in your webpack config.
    

    此时编辑package.json文件,将vue-loader改为如下版本:

    "vue-loader": "^13.0.0",
    

    保存后,执行如下命令就解决了:

    npm install
    npm run build
    

    vue组件的使用

    新建src/vue/Button.vue文件,目录结构如下:

    编辑Button.vue文件,添加如下代码:

    <template>
      <div>
        <button>这是button组件</button>
      </div>
    </template>
    
    <script>
    export default {
      name: "Button"
    };
    </script>
    
    <style>
    </style>
    

    接下来编辑App.vue文件,做如下更改:

    <template>
      <div>
        <h2 class="color">hello world</h2>
        <button>按钮</button>
        <h2>{{message}}</h2>
    +   <Button></Button>
      </div>
    </template>
    
    <script>
    +   import Button from "./Button.vue";
    
        export default {
          name: "App",
    +     components: {
    +       Button
    +     },
          data() {
            return {
              message: "hello vue!!!"
            };
          }
        };
    </script>
    
    <style scoped>
    .color {
      color: orange;
    }
    </style>
    

    最后执行npm run build即可!

    如果我们在App.vue文件中:

    import Button from "./Button.vue";
    

    上面代码末尾的.vue去掉简写打包的话,就会出现报错。

    此时如果想简写,又想不报错,在webpack.config.js文件,添加如下代码即可解决:

      resolve: {
    +   extensions: ['.css', '.js', '.vue'],
        alias: {
          'vue$': 'vue/dist/vue.esm.js'
        }
      }
    

    Plugins

    BannerPlugin

    作用:添加版权信息。

    编辑webpack.config.js文件,添加如下代码:

        const path = require('path')
    +   const webpack = require('webpack')
    
        module.exports = {
          entry: './src/main.js',
    +     plugins: [
    +       new webpack.BannerPlugin(`最终版权归LqZww所有!`)
    +     ]
        }
    

    打包后即可在js文件里的头部看见所写的版权信息!

    HtmlWebpackPlugin

    作用:打包后可以在dist目录下自动生成index.html文件,也可以将打包的js文件自动通过script标签插入body中。

    安装html-webpack-plugin

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

    编辑webpack.config.js文件,增删如下代码:

        const path = require('path')
        const webpack = require('webpack')
    +   const HtmlWebpackPlugin = require('html-webpack-plugin')
    
        module.exports = {
          entry: './src/main.js',
          output: {
            path: path.resolve(__dirname, 'dist'),
            filename: 'bundle.js',
    -       publicPath: './dist/'
          },
          plugins: [
            new webpack.BannerPlugin(`最终版权归LqZww所有!`),
    +       new HtmlWebpackPlugin({
    +         template: 'index.html'
    +       })
          ]
        }
    

    打包后就可以在dist目录下看见index.html文件,如下:

    UglifyjsWebpackPlugin

    作用:对打包的js文件进行压缩。

    这里使用1.1.1版本,与cli2一致。

    安装uglifyjs-webpack-plugin

    npm install uglifyjs-webpack-plugin@1.1.1 --save-dev
    

    编辑webpack.config.js文件,添加如下代码:

        const path = require('path')
        const webpack = require('webpack')
        const HtmlWebpackPlugin = require('html-webpack-plugin')
    +   const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin')
    
        module.exports = {
          entry: './src/main.js',
          plugins: [
            new webpack.BannerPlugin(`最终版权归LqZww所有!`),
            new HtmlWebpackPlugin({
              template: 'index.html'
            }),
    +       new UglifyjsWebpackPlugin()
          ]
        }
    

    打包后就可以发现dist目录下的js文件是进行了压缩。

    webpack-dev-server

    作用:实现实时重新加载功能

    安装webpack-dev-server

    npm install --save-dev webpack-dev-server@2.9.3
    

    编辑webpack.config.js文件,添加如下代码:

        module.exports = {
          entry: './src/main.js',
          output: {
          },
          module: {
          },
          resolve: {
          },
          plugins: [
          ],
    +     devServer: {
    +       contentBase: './dist',
    +       inline: true
    +     }
        }
    

    运行方法一:

    在命令行里输入命令:

    ./node_modules/.bin/webpack-dev-server
    

    然后默认直接访问http://localhost:8080/即可!

    运行方法二:

    编辑package.json文件,添加如下代码:

      "scripts": {
        "test": "echo "Error: no test specified" && exit 1",
        "build": "webpack",
    +   "dev": "webpack-dev-server --open"
      },
    

    然后在命令行里输入下列命令:

    npm run dev
    

    我们就会看到浏览器自动加载页面,更改代码后将自动重新加载。

    配置文件分离

    安装webpack-merge

    npm install --save-dev webpack-merge
    

    创建build文件夹,然后新建common.config.js、dev.config.js、prod.config.js文件,删除webpack.config.js文件,目录结构如图:

    原webpack.config.js文件内容为:

    const path = require('path')
    const webpack = require('webpack')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin')
    
    module.exports = {
      entry: './src/main.js',
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js'
      },
      module: {
        rules: [
          {
            test: /.css$/,
            // 多个loader时,从右向左读取
            use: ['style-loader', 'css-loader']
          },
          {
            test: /.less$/,
            use: [{
              loader: "style-loader"
            }, {
              loader: "css-loader"
            }, {
              loader: "less-loader"
            }]
          },
          {
            test: /.(png|jpg|gif)$/,
            use: [
              {
                loader: 'url-loader',
                options: {
                  limit: 30000,
                  name: 'img/[name].[hash:8].[ext]'
                }
              }
            ]
          },
          {
            test: /.js$/,
            exclude: /(node_modules|bower_components)/,
            use: {
              loader: 'babel-loader',
              options: {
                presets: ['es2015']
              }
            }
          },
          {
            test: /.vue$/,
            use: ['vue-loader']
          }
        ]
      },
      resolve: {
        extensions: ['.css', '.js', '.vue'],
        alias: {
          'vue$': 'vue/dist/vue.esm.js'
        }
      },
      plugins: [
        new webpack.BannerPlugin(`最终版权归LqZww所有!`),
        new HtmlWebpackPlugin({
          template: 'index.html'
        }),
        new UglifyjsWebpackPlugin()
      ],
      devServer: {
        contentBase: './dist',
        inline: true
      }
    }
    

    现将原webpack.config.js代码拷贝至common.config.js中,并删除devServer、UglifyjsWebpackPlugin模块代码。

    再将devServer提取到dev.config.js文件中,将UglifyjsWebpackPlugin提取到prod.config.js文件中。

    具体代码如下:

    common.config.js:

    const path = require('path')
    const webpack = require('webpack')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
      entry: './src/main.js',
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js'
      },
      module: {
        rules: [
          {
            test: /.css$/,
            // 多个loader时,从右向左读取
            use: ['style-loader', 'css-loader']
          },
          {
            test: /.less$/,
            use: [{
              loader: "style-loader"
            }, {
              loader: "css-loader"
            }, {
              loader: "less-loader"
            }]
          },
          {
            test: /.(png|jpg|gif)$/,
            use: [
              {
                loader: 'url-loader',
                options: {
                  limit: 30000,
                  name: 'img/[name].[hash:8].[ext]'
                }
              }
            ]
          },
          {
            test: /.js$/,
            exclude: /(node_modules|bower_components)/,
            use: {
              loader: 'babel-loader',
              options: {
                presets: ['es2015']
              }
            }
          },
          {
            test: /.vue$/,
            use: ['vue-loader']
          }
        ]
      },
      resolve: {
        extensions: ['.css', '.js', '.vue'],
        alias: {
          'vue$': 'vue/dist/vue.esm.js'
        }
      },
      plugins: [
        new webpack.BannerPlugin(`最终版权归LqZww所有!`),
        new HtmlWebpackPlugin({
          template: 'index.html'
        })
      ]
    }
    

    prod.config.js:

    const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin')
    const WebpackMerge = require('webpack-merge')
    const commonConfig = require('./common.config')
    
    module.exports = WebpackMerge(commonConfig, {
      plugins: [
        new UglifyjsWebpackPlugin()
      ]
    })
    

    dev.config.js:

    const WebpackMerge = require('webpack-merge')
    const commonConfig = require('./common.config')
    
    module.exports = WebpackMerge(commonConfig, {
      devServer: {
        contentBase: './dist',
        inline: true
      }
    })
    

    再修改下webpack.config.js文件,修改如下代码:

        module.exports = {
          entry: './src/main.js',
          output: {
    -       path: path.resolve(__dirname, 'dist'),
    +       path: path.resolve(__dirname, '../dist'),
            filename: 'bundle.js'
          },
    

    还需要修改package.json文件,修改如下代码:

      "scripts": {
        "test": "echo "Error: no test specified" && exit 1",
    -   "build": "webpack",
    +   "build": "webpack --config ./build/prod.config.js",
    -   "dev": "webpack-dev-server --open"
    +   "dev": "webpack-dev-server --open --config ./build/dev.config.js"
      },
    

    做完以上的配置,就可以顺序的执行npm run buildnpm run dev命令了!

    参考

    webpack loader

    webpack plugin

    webpack-dev-server

    环境配置

    配置源码

  • 相关阅读:
    多线程 信号量
    sql在不同数据库查询前几条数据
    Office Outlook同步 很奇怪的BUG
    搜索小技巧整理
    想做一个权限管理插件
    ibatis和Castle学习历程
    查找存储过程中的错误位置
    VS2005项目模版丢失解决方案及VS2005项目模版查找原理
    C# 邮件发送接收
    数据库优化整合
  • 原文地址:https://www.cnblogs.com/LqZww/p/12036520.html
Copyright © 2011-2022 走看看