WebPack

WebPack Vue项目中基本使用

2020-05-06  本文已影响0人  Lao书生

一般使用脚手架CLI直接会创建。这里只是理解Vue中是怎样使用和基本运行webpack的。

一、起步

1.1. 安装 nodejs

因为webpack在执行打包压缩的时候是依赖nodejs,所以必须要安装。
CMD(终端)中输入node -v查看版本,存在安装 over!

1.2. 安装 Webpack

1.全局安装(在项目外也可以使用)- 输入npm install webpack -g(因为安装node时带着安装了npm)

  1. 局部安装(在项目只能内使用) - 输入npm install webpack --save-dev(全局安装的目的是,后期项目中会有package.js这么一个文件,在整个文件中使用到了Webpack命令)

1.3. Webpack基本使用(demo项目 "/" - 为跟目录 )

  1. 创建文件/src/index.js/src/js/demo.js文件
// index.js
import {name,age,height} from "./demo.js";
console.log(name);
console.log(age);
console.log(height);
// demo.js
export const name = 'barry';
export const age = '18';
export const height = 1.88;
  1. 运行webpack ./src/index.js ./dist/bundle.jsindex.js文件中导入ES6模块文件,会自动打包,在html文件中可以直接引用,暂不粘贴代码)

二、 Webpack配置文件

  1. 创建配置/webpack.config.js文件
const path = require('path');
module.exports = {
  // 入口
  // 全局变量 _dirname 保存现在的路径
  entry: './src/main.js',
  // 出口
  output: {
    // 需要使用绝对路径
    // __dirname -> node中的变量(动态获取)
    path: path.resolve(__dirname,'dist'),
    filename: 'bundle.js'
  }
};
  1. 初始化npm init配置package.json文件
{
  "name": "meetwebpack",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    // 在cmd中输入npm run build
    // 会直接自动找本地 webpack 包
    "build": "webpack"
  },
  "author": "",
  "license": "ISC",
  // 开发时候的依赖
  // 配置本地webpack包:
  // 通过 npm install  webpack@3.6.0 --save-dev 安装后产生
  "devDependencies": {
    "webpack": "^3.6.0"
  }
}

三、loader(安装过程可以根据 官网 提示步骤操作)

  1. 基本代码样式:
module.exports = {
  module: {
    rules: [
      // 配置不同文件使用的loader
      {
        // 文件的样式
        test:/\.xxx$/,
        // 配置上边test对应文件使用相关的loader(可以使用多个)
        use:[]
      },
      {},...
    ],
  },
};
  1. CSS依赖文件(还有好多loader,而且内部有注意事项,So暂仅举例一个)
    2.1 webpack.config.js中的代码为:
module.exports = {
  module: {
    rules: [
      // 配置不同文件使用的loader
      ...,
      {
        test: /\.(png|jpg|gif|jpeg)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              // 当加载图片,小于limit时,会将图片编译成base64字符串形式
              // 当图片大于limit时,需要使用file-loader,将文件放到dist文件中
              // 默认命名是按照32位hash值命名的
              limit: 8192
            }
          }
        ]
      }
    ],
  },
};

2.2 当图片大于limit时,需要使用file-loadernpm install --save-dev file-loader不许要配置,如果是图片会将图片文件打包到dist文件夹中。
2.3 需要修改 webpack.config.js配置文件中出口output,并给图片文件重命名

module.exports = {
  // 入口
  // 全局变量 _dirname 保存现在的路径
  entry: './src/main.js',
  // 出口
  output: {
    // 需要使用绝对路径
    // __dirname -> node中的变量(动态获取)
    path: path.resolve(__dirname,'dist'),
    filename: 'bundle.js'
    // 设计到URL的文件都会在前边添加 dist/
    // 开发时不会有
    publicPath: 'dist/'
  }
};
module.exports = {
  module: {
    rules: [
      // 配置不同文件使用的loader
      ...,
      {
        test: /\.(png|jpg|gif|jpeg)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
                // 当加载图片,小于limit时,会将图片编译成base64字符串形式
                // 当图片大于limit时,需要使用file-loader,将文件放到dist文件中
                // 默认命名是按照32位hash值命名的
                limit: 7000,
                // 设置默认的图片保存路径、名字以及后缀
                name: 'img/[name].[hash:8].[ext]'
              }
           }
         ]
       }
    ],
  },
};

四、配置Vue

直接使用webpack打包.vue文件会报错。
在打包的时候会产生两个版本:

  1. 使用npm本地安装vue(npm install vue --save
  2. 在JS入口文件中引用
// 导入vue在node_modules中
import Vue from 'vue';
// 使用vue
const app = new Vue({
  el: '#app',
  data: {
    message: 'hello webpack'
  }
});
  1. webpack.config.js中指定 runtime-compiler 版本
module.exports = {
  module: {
    // 入口
    // 全局变量 _dirname 保存现在的路径
    entry: './src/main.js',
    // 出口
    output: { },
    // 配置resolve指定vue版本
    resolve:{
      // alias - 别名
      // 指向node_modules文件中vue/dist/vue.esm.js文件
      // 因为vue.esm.js中有runtime-compiler
      alias:{
        'vue$': 'vue/dist/vue.esm.js'
      }
    }
  },
};
  1. 配置vue的loadernpm install vue-loader vue-template-compiler --save-dev
{
  // 以xxxx结尾添加$
  test: /\.vue$/,
  use: ['vue-loader']
}
  1. package.json 中修改vue-loader 版本 ^13.0.0(^ - 13版本以上的版本,14版本开始需要安装插件麻烦)
"vue-loader": "^13.0.0"

五、Plugin(插件)

将现有的框架进行扩展

添加版权声明

配置webpack.config.js

// 本地导入 webpack
const webpack = require('webpack');
module.exports = {
    ...,
    plugins: [
        // 版权声明扩展
        new webpack.BannerPlugin('最终版权归barry所有')
    ]
}

dist文件夹添加index.html

// 本地导入 html-webpack-plugin
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
    ...,
    plugins: [
        // 版权声明扩展
        new webpack.BannerPlugin('最终版权归barry所有'),
        // 会将项目目录中的index.html文件作为模板放入dist文件中
        // index.html文件中不需要引入script入口文件(自动引入)
        new HtmlWebpackPlugin({
            template: 'index.html'
        })
    ]
}

代码压缩(代码丑化)

  1. 本地安装npm install uglifyjs-webpack-plugin@1.1.1 --save-dev
  2. 配置webpack.config.js
// 本地导入 html-webpack-plugin
const uglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin');
module.exports = {
    ...,
    plugins: [
        // 版权声明扩展
        new webpack.BannerPlugin('最终版权归barry所有'),
        // 会将项目目录中的index.html文件作为模板放入dist文件中
        // index.html文件中不需要引入script入口文件(自动引入)
        new HtmlWebpackPlugin({
            template: 'index.html'
        }),
        new uglifyjsWebpackPlugin()
    ]
}

七、搭建本地服务器

  1. 本地安装npm install webpack-dev-server@2.9.3 --save-dev
  2. 配置webpack.config.js
module.exports = {
    ...,
    plugins: [
        // 版权声明扩展
        new webpack.BannerPlugin('最终版权归barry所有'),
        // 会将项目目录中的index.html文件作为模板放入dist文件中
        // index.html文件中不需要引入script入口文件(自动引入)
        new HtmlWebpackPlugin({
            template: 'index.html'
        }),
        new uglifyjsWebpackPlugin(),
        // 服务于那个文件夹
        devServer: {
            contentBase: './dist',
            // 是否实时监听
            inline: true,
            // 端口号
            port: 8088
        }
    ]
}
  1. cmd中输入npm run dev跑服务
"scripts": {
  ...,
  // 会自动打开网页
  "dev": "webpack-dev-server  --open"
},

七、webpack文件合并

将webpack配置文件抽离开 使用webpack-merge将文件和并

  1. 安装npm install webpack-merge
  2. 在需要合并的 js文件中导入
const webpackMerge = require('webpack-merge');
const baseConfig = require('./base.config');
// 搭建本地服务器
module.exports = webpackMerge(baseConfig,{
  devServer: {
    contentBase: './dist',
    // 是否实时监听
    inline: true,
    // 端口号
    port: 8088
  }
});
上一篇下一篇

猜你喜欢

热点阅读