zoukankan      html  css  js  c++  java
  • webpack 开发环境与生成环境的 配置

    写在前面

    最近学习react,之前做vue项目的时候,一直都是拿来主义,浑浑噩噩,感觉不太好,趁学习react的机会,在顺带学习一下webpack。一般配置文件分两份,为开发环境和生成环境。有此区分,是为了更好的利用缓存,生成环境将所有的第三分库文件打包成一个,所有的业务逻辑的文件就会单独生成一个,每次业务逻辑的修改之后,在生成环境中只需要上传修改代码逻辑的部分,而第三方库文件则不会修改,如此只需更新少量的代码,增加加载的速度。

    webpack.config.js 开发开发环境的配置

    package.json文件的内容

    
    {
      "name": "react-dianping-webpack",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "start": "NODE_ENV=dev webpack-dev-server --progress --colors",
        "build": "rm -rf ./build && NODE_ENV=production webpack --config ./webpack.production.config.js --progress --colors"
      },
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "autoprefixer": "^6.4.0",
        "babel-core": "^6.14.0",
        "babel-loader": "^6.2.5",
        "babel-plugin-react-transform": "^2.0.2",
        "babel-preset-es2015": "^6.14.0",
        "babel-preset-react": "^6.11.1",
        "css-loader": "^0.24.0",
        "eslint": "^3.4.0",
        "eslint-loader": "^1.5.0",
        "extract-text-webpack-plugin": "^1.0.1",
        "file-loader": "^0.9.0",
        "html-webpack-plugin": "^2.22.0",
        "json-loader": "^0.5.4",
        "koa": "^1.2.2",
        "koa-router": "^5.4.0",
        "less": "^2.7.1",
        "less-loader": "^2.2.3",
        "open-browser-webpack-plugin": "0.0.2",
        "postcss-loader": "^0.11.0",
        "react-transform-hmr": "^1.0.4",
        "style-loader": "^0.13.1",
        "url-loader": "^0.5.7",
        "webpack": "^1.13.2",
        "webpack-dev-server": "^1.15.0"
      },
      "dependencies": {
        "react": "^15.3.1",
        "react-dom": "^15.3.1"
      }
    }
    
    

    weboack.config.js文件的配置

    var path =require('path')
    var webpack = require('webpack') // 在package.json之中(dev)dependencies的名字,main
    var HtmlWebpackPlugin = require('html-webpack-plugin') // 可以指定打包完成之后的js文件的挂载点
    var OpenBrowserPlugin = require('open-browser-webpack-plugin') // 浏览器自动打开文件
    
    module.exports = {
        entry:path.resolve(__dirname,'app/index.jsx'), // 打包入口文件
        output:{
            filename:"bundle.js"
        },
        resolve:{
            extensions:['','js','jsx'],// require 或者import的时候,不需要添加的文件后缀名
        },
        module:{
            loaders:[
                {test:/.(js|jsx)$/,exclude:/node_modules/,loader:'babel'},
                {test:/.less$/,exclude:/node_modules/,loader:'style!css!postcss!less'},// css-loader引入css文件,style-loader创建style标签,从右向左执行,顺序不可改变。
                {test:/.css$/,exclude:/node_modules/,loader:'style!css!postcss'},
                {test:/.(png|gif|jpg|jpeg|bmp)$/i,exclude:/node_modules/,loader:'url-loader?limit=5000'}, // Loads files as `base64` encoded URL
                {test:/.(png|woff|woff2|svg|ttf|eot)($|?)/i,exclude:/node_modules/,loader:'url-loader?limit=5000'}
            ]
        },
    
        postcss:[
            require('autoprefixer')  //调用autoprefixer插件,例如 display: flex
        ],
        
        plugins:[
            // html 模板插件
            new HtmlWebpackPlugin({
                template:__dirname+ '/app/index.tmpl.html'
            }),
    
            // 热加载插件,即不用刷新浏览器便可以展现修改
            new  webpack.HotModuleReplacementPlugin(),
    
            // 运行终端就可以打开文件
            new OpenBrowserPlugin({
                url: 'http://localhost:8080'
            }),
    
            // 定义生产环境还是开发环境,一般是配合package.json之中的script标签的使用
            new webpack.DefinePlugin({
                __DEV__:JSON.stringify(JSON.parse((ProgressEvent.evn.NODE_DEV == "dev") || false))
            })
        ],
    
        devServer: {
            colors: true, //终端中输出结果为彩色
            historyApiFallback: true, //不跳转,在开发单页应用时非常有用,它依赖于HTML5 history API,如果设置为true,所有的跳转将指向index.html
            inline: true, //实时刷新
            hot: true  // 使用热加载插件 HotModuleReplacementPlugin
        }
    
    }
    
    

    生产环境中的webpack.production.config.js的配置

    
    var pkg = require('./package.json')
    var path = require('path')
    var webpack = require('webpack');
    var HtmlWebpackPlugin = require('html-webpack-plugin');
    var ExtractTextPlugin = require('extract-text-webpack-plugin');
    
    module.exports = {
      entry: {
        app: path.resolve(__dirname, 'app/index.jsx'),
        // 将 第三方依赖(node_modules中的) 单独打包
        vendor: Object.keys(pkg.dependencies)
      },
      output: {
        path: __dirname + "/build",
        filename: "/js/[name].[chunkhash:8].js"
      },
    
      resolve:{
          extensions:['', '.js','.jsx']
      },
    
      module: {
        loaders: [
            { test: /.(js|jsx)$/, exclude: /node_modules/, loader: 'babel' },
            { test: /.less$/, exclude: /node_modules/, loader: ExtractTextPlugin.extract('style', 'css!postcss!less') },
            { test: /.css$/, exclude: /node_modules/, loader: ExtractTextPlugin.extract('style', 'css!postcss') },
            { test:/.(png|gif|jpg|jpeg|bmp)$/i, loader:'url-loader?limit=5000&name=img/[name].[chunkhash:8].[ext]' },
            { test:/.(png|woff|woff2|svg|ttf|eot)($|?)/i, loader:'url-loader?limit=5000&name=fonts/[name].[chunkhash:8].[ext]'}
        ]
      },
      postcss: [
        require('autoprefixer')
      ],
    
      plugins: [
        // webpack 内置的 banner-plugin
        new webpack.BannerPlugin("Copyright by wangfupeng1988@github.com."),
    
        // html 模板插件
        new HtmlWebpackPlugin({
            template: __dirname + '/app/index.tmpl.html'
        }),
    
        // 定义为生产环境,编译 React 时压缩到最小
        new webpack.DefinePlugin({
          'process.env':{
            'NODE_ENV': JSON.stringify(process.env.NODE_ENV)
          }
        }),
    
        // 为组件分配ID,通过这个插件webpack可以分析和优先考虑使用最多的模块,并为它们分配最小的ID
        new webpack.optimize.OccurenceOrderPlugin(),
        
        new webpack.optimize.UglifyJsPlugin({
            compress: {
              //supresses warnings, usually from module minification
              warnings: false
            }
        }),
        
        // 分离CSS和JS文件
        new ExtractTextPlugin('/css/[name].[chunkhash:8].css'), 
        
        // 提供公共代码
        new webpack.optimize.CommonsChunkPlugin({
          name: 'vendor',
          filename: '/js/[name].[chunkhash:8].js'
        }),
    
        // 可在业务 js 代码中使用 __DEV__ 判断是否是dev模式(dev模式下可以提示错误、测试报告等, production模式不提示)
        new webpack.DefinePlugin({
          __DEV__: JSON.stringify(JSON.parse((process.env.NODE_ENV == 'dev') || 'false'))
        })
      ]
    }
    
    
  • 相关阅读:
    C++防止头文件反复包括
    yppasswd, ypchfn, ypchsh
    yes
    Yacc
    xxd
    xpdf -Portable Document Format(PDF)文件阅读器
    xinetd
    xargs
    x25, PF_X25
    write -在一个文件描述符上执行写操作
  • 原文地址:https://www.cnblogs.com/lakeInHeart/p/7486083.html
Copyright © 2011-2022 走看看