zoukankan      html  css  js  c++  java
  • webpack前端自动化构建工具

    博主不易,不求赞赏,希望把自己遇到的难点写出来,以及希望自己能有能力写出一篇不错的博文。

    前端构建工具本人 bootstrap+jquery用gulp

                                 vue+element 用webpack

    本人最近写的一个vue项目的目录结构

    一:package.json

    {
      "name": "szhong",
      "version": "1.0.0",
      "description": "这是三中建材官网",
      "main": "index.js",
      "scripts": {
        "test": "echo "Error: no test specified" && exit 1",
        "dev": "webpack-dev-server --progress --config webpack.config.dev.js --port 6008 --open --hot",
        "build": "webpack --progress --config webpack.config.prod.js"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "dependencies": {
        "axios": "^0.18.0",
        "element-ui": "^2.3.4",
        "iview": "^2.13.0",
        "jquery": "^3.3.1",
        "v-distpicker": "^1.0.16",
        "vue": "^2.5.16",
        "vue-lazyload": "^1.2.3",
        "vue-router": "^3.0.1",
        "moment": "^2.22.1",
        "vuex": "^3.0.1"
      },
      "devDependencies": {
        "babel-core": "^6.26.2",
        "babel-loader": "^7.1.4",
        "babel-plugin-component": "^1.1.0",
        "babel-plugin-import": "^1.7.0",
        "babel-plugin-syntax-dynamic-import": "^6.18.0",
        "babel-preset-env": "^1.6.1",
        "clean-webpack-plugin": "^0.1.19",
        "css-loader": "^0.28.11",
        "extract-text-webpack-plugin": "^3.0.2",
        "file-loader": "^1.1.11",
        "html-webpack-plugin": "^3.2.0",
        "style-loader": "^0.20.3",
        "url-loader": "^1.0.1",
        "vue-loader": "^14.2.2",
        "vue-template-compiler": "^2.5.16",
        "webpack": "^3.11.0",
        "webpack-dev-server": "^2.11.2"
      }
    }

    二:webpack.config.dev.js

    const HtmlWebpackPlugin = require('html-webpack-plugin')
    const webpack = require('webpack')
    
    module.exports = {
        entry: './src/main.js',//入口
        module: {
            rules: [
                {
                    test: /.vue$/,
                    use: ['vue-loader']
                },
                {
                    test: /.css$/,
                    use: ['style-loader', 'css-loader']
                },
                {
                    test: /.(ttf|eot|woff|svg|jpg|png|gif)$/,
                    use: [
                        {
                            loader: 'url-loader'
                        }
                    ]
                }
            ]
        },
        devServer: {
            overlay: true //报错的时候,在页面上弹出一个遮罩,并且把错误显示在上面
        },
        resolve: {
            //给我们导入的文件自动按照从前到后的顺序加后缀
            extensions: [".vue", ".js", ".json"]
        },
        plugins: [
            //将来以template为模版,生成一个index.html并且发布到webpack-dev-server开启的node服务器上面去
            new HtmlWebpackPlugin({
                template: './template.html'
            }),
            new webpack.ProvidePlugin({
                $: "jquery",
                jQuery: "jquery"
            })
        ]
    }

    三:webpack.config.prod.js

    const HtmlWebpackPlugin = require('html-webpack-plugin')
    const webpack = require('webpack')
    const path = require('path')
    //打包之前,删除dist目录
    var CleanWebpackPlugin = require('clean-webpack-plugin')
    //从bundle.js中抽离css
    const ExtractTextPlugin = require("extract-text-webpack-plugin")
    
    module.exports = {
        entry: {
            "axios":['axios'],
            "quanjiatong":['vue','vue-router','vuex'],
            "jquery":['jquery'],
            "moment":['moment'],
            "v-distpicker":['v-distpicker'],
            "vue-lazyload":['vue-lazyload'],
            "bundle":'./src/main.js' //别忘记了我们自己的业务代码
        },//多入口配置
        output:{//生产阶段,必须要设置它
            path:path.resolve(__dirname,"dist"),
            filename:'js/[name]-[hash:5].js'
        },
        module: {
            rules: [
                {
                    test: /.vue$/,
                    use: ['vue-loader']
                },
                {
                    test: /.css$/,
                    use: ExtractTextPlugin.extract({
                        fallback: "style-loader",
                        use: {
                            loader:'css-loader',
                            options:{
                                minimize: true, //在抽取css的时候同时进行压缩
                                publicPath:'dist/css'
                            }
                        }
                    })
                },
                {
                    test: /.(jpg|png|gif)$/,
                    use: [
                        {
                            loader: 'url-loader',
                            options: {
                                limit: 8192,//打包的阀值,如果我们的资源小于阀值,就会打包进入bundle.js,如果静态资源超过阀值,单独提取出来,不打包进入bundle.js,阀值根据公司的需要来设置
                                name:'statics/imgs/[name]-[hash:5].[ext]'
                            }
                        }
                    ]
                },
                {
                    test: /.(ttf|eot|woff|svg)$/,
                    use: [
                        {
                            loader: 'url-loader',
                            options: {
                                limit: 8192,//打包的阀值,如果我们的资源小于阀值,就会打包进入bundle.js,如果静态资源超过阀值,单独提取出来,不打包进入bundle.js,阀值根据公司的需要来设置
                                name:'statics/fonts/[name]-[hash:5].[ext]'
                            }
                        }
                    ]
                },
                { 
                    test: /.js$/, 
                    exclude: /node_modules/, //排除node_modules里面文件,一定要加上
                    loader: "babel-loader" 
                }
            ]
        },
        resolve: {
            //给我们导入的文件自动按照从前到后的顺序加后缀
            extensions: [".vue", ".js", ".json"]
        },
        plugins: [
            //打包之前,删除dist目录,写在其它插件前面
            new CleanWebpackPlugin('dist'),
    
            //将来以template为模版,生成一个index.html并且发布到webpack-dev-server开启的node服务器上面去
            new HtmlWebpackPlugin({
                template: './template.html',
                minify:{
                    removeComments: true,//压缩注释
                    minifyJS: true,//压缩js
                    minifyCSS: true,//压缩css
                    collapseWhitespace: true,//去除空格
                }
            }),
            new webpack.ProvidePlugin({
                $: "jquery",
                jQuery: "jquery"
            }),
            //设置当前环境为生产环境
            new webpack.DefinePlugin({
                'process.env': {
                  NODE_ENV: '"production"'
                }
            }),
            //压缩,必须先转成es5,再压缩
            new webpack.optimize.UglifyJsPlugin({
                compress: {
                  warnings: false, //压缩掉警告
                  drop_debugger: true,
                  drop_console: true //去除console.log
                },
                comments: false //去掉版权信息等注释
            }),
    
            //抽离第三方包的,这里不要写bundle.js
            new webpack.optimize.CommonsChunkPlugin({
                name: ["vue-lazyload", "v-distpicker", "moment", "jquery", "quanjiatong", "axios"],
                // filename: "vendor.js"
                // (给 chunk 一个不同的名字)
    
                minChunks: Infinity, //可以接一个数字,比如2,只有我们的第三方包至少被引用了2次,我才抽,如果只有一次,就不抽,Infinity代表不管你是使用了多少次我都抽取
                // (随着 entry chunk 越来越多,
                // 这个配置保证没其它的模块会打包进 vendor chunk)
            }),
            //把抽离的css放在哪里去
            new ExtractTextPlugin("css/styles-[hash:5].css"),
    
            //只保留moment中的简体中文
            new webpack.ContextReplacementPlugin(/moment[/\]locale$/, /zh-cn/)
        ]
    }

  • 相关阅读:
    HTML DOM item() 方法
    php输出年份
    CSS中如何选择ul下li的奇数、偶数行
    对象的继承
    this指向
    如何安装Firebug
    JSON数据格式
    PHP: configure: error: mysql configure failed. Please check config.log for more information.
    linux下挂载iso镜像文件(转)
    Linux 下mysql修改数据库存放目录方法和可能遇到的问题
  • 原文地址:https://www.cnblogs.com/DZzzz/p/8998588.html
Copyright © 2011-2022 走看看