博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

webpack打包vue -->简易讲解

Posted on 2018-06-24 14:58  SmarTom  阅读(776)  评论(0编辑  收藏  举报

### 1. 测试环境:

推荐这篇文章:讲的很细致

https://www.cnblogs.com/lhweb15/p/5660609.html

1. webpack.config.js自行安装

{
  "name": "vuetest",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "webpack --display-modules --display-chunks --config build/webpack.config.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "babel-loader": "^7.1.4",
    "babel-preset-es2015": "^6.24.1",
    "css-loader": "^0.28.11",
    "file-loader": "^1.1.11",
    "html-webpack-plugin": "^3.2.0",
    "less": "^3.0.4",
    "less-loader": "^4.1.0",
    "style-loader": "^0.21.0",
    "vue": "^2.5.16",
    "webpack": "^4.12.0",
    "webpack-dev-server": "^3.1.4"
  },
  "devDependencies": {
    "babel-cli": "^6.26.0",
    "express": "^4.16.3",
    "webpack-cli": "^3.0.8",
    "webpack-dev-middleware": "^3.1.3",
    "webpack-hot-middleware": "^2.22.2"
  }
}

 

2.配置文件:

dev-clietn.js

var hotClient = require('webpack-hot-middleware/client')

// 订阅事件,当 event.action === 'reload' 时执行页面刷新
hotClient.subscribe(function (event) {
    if (event.action === 'reload') {
        window.location.reload()
    }
})

 

webpack.config.js

// nodejs 中的path模块
var path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var webpack = require('webpack');
module.exports = {
    mode:"development",
    //entry:['webpack-hot-middleware/client', path.resolve(__dirname, '../app/index.js')],
    entry: {
        app: [
            './build/dev-client',
            path.resolve(__dirname, '../app/index.js')
        ]
    },
    // 输出配置
    output: {
        // 输出路径是 myProject/output/static
        path: path.resolve(__dirname, './static'),
        //publicPath: 'static/',
        publicPath: "/",
        filename: '[name].[hash].js',
        chunkFilename: '[id].[chunkhash].js'
    },
    resolve:{
        alias:{
            'vue$':'vue/dist/vue.js'
        }
    },
    module:{
        rules: [
            {test: /\.vue$/, loader: 'vue-loader' },
            {test:/\.(eot|woff|woff2|svg|ttf)([\?]?.*)$/,loader:"file-loader"},
            {test: /\.(png|jpg|gif)$/,loader: 'url-loader?limit=8192'},
            {test: /\.less$/i, use: ['style-loader', { loader: 'css-loader', options: { importLoaders: 1 } },'less-loader']},
        ]
    },
    plugins: [
        // 添加三个插件
        new webpack.optimize.OccurrenceOrderPlugin(),
        new webpack.HotModuleReplacementPlugin(),
        new webpack.NoEmitOnErrorsPlugin(),
        new HtmlWebpackPlugin({
            filename: 'index.html',
            template: path.resolve(__dirname, '../app/index.html'),
            inject: true
        }),
    ]
}

 

webpack.dev.config.js

// 引入必要的模块
var express = require('express')
var webpack = require('webpack')
var config = require('./webpack.config')

// 创建一个express实例
var app = express()

// 调用webpack并把配置传递过去
var compiler = webpack(config)

// 使用 webpack-dev-middleware 中间件
var devMiddleware = require('webpack-dev-middleware')(compiler, {
    publicPath: config.output.publicPath,
    stats: {
        colors: true,
        chunks: false
    }
})
var hotMiddleware = require('webpack-hot-middleware')(compiler)
// webpack插件,监听html文件改变事件
compiler.plugin('compilation', function (compilation) {
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
    // 发布事件
    hotMiddleware.publish({ action: 'reload' })
        cb()
    })
})
// 注册中间件
app.use(devMiddleware)
app.use(hotMiddleware)
// 监听 8881端口,开启服务器
app.listen(8881, function (err) {
    if (err) {
        console.log(err)
        return
    }
    console.log('Listening at http://localhost:8881')
})

 

### 2. 生产环境

 

### 3.打包优化