webpack环境搭建

本地服务器

$_> npm i -D webpack-dev-server

// webpack.config.js
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const cleanWebpackPlugins = require('clean-webpack-plugin');

module.exports = {
    entry: {
        index: './src/index.js',
        util: './src/util.js',
    },
    output: {
        path: path.resolve(__dirname, 'dist'),
        publicPath: '/',
        filename: 'js/[name].bundle.js',
    },
    module: {
        rules: [{
            test: /\.(css)$/,
            use: ['style-loader', 'css-loader']
        }, {
            test: /\.(jpeg|png|jpg)$/,
            use: {
                loader: 'file-loader',
                options: {
                    outputPath: 'assets/imgs/',
                }
            }
        }, {
            test: /\.(html)$/,
            use: { loader: 'html-loader' }

        }]
    },
    plugins: [
        new HtmlWebpackPlugin({
            filename: 'index.html',
            template: './src/html/index.html',
            inject: 'body',
            chunks: ['index']
        }),
        new cleanWebpackPlugins(['dist'])
    ],
    devServer: {
        contentBase: path.join(__dirname, 'dist'), // 根路径
        port: 8080,
        historyApiFallback: {}, //访问不存在的路径不会报错,单页应用 
        proxy: { // 设置代理,跨域
            '/api': { // http://localhost:8080/api
                target: 'http://localhost:8080', // 请求的域名
                changeOrigin: true,
                secure: false,
                logLevel: 'debug', // 控制台打印日志
                headers: {}, // http头部
            }
        }
    },
    mode: 'development'
};

// package.json
"scripts":{
   "server": "webpack-dev-server --open"
}
$_> npm run server

模块热更新

不用刷新即可更新某部分

$_> npm i -D webpack-dev-server

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const cleanWebpackPlugins = require('clean-webpack-plugin');

module.exports = {
    entry: {
        index: './src/index.js',
        util: './src/util.js',
    },
    output: {
        path: path.resolve(__dirname, 'dist'),
        publicPath: '/',
        filename: 'js/[name].bundle.js',
    },
    module: {
        rules: [{
            test: /\.(css)$/,
            use: ['style-loader', 'css-loader']
        }, {
            test: /\.(jpeg|png|jpg)$/,
            use: {
                loader: 'file-loader',
                options: {
                    outputPath: 'assets/imgs/',
                }
            }
        }, {
            test: /\.(html)$/,
            use: { loader: 'html-loader' }

        }]
    },
    plugins: [
        new HtmlWebpackPlugin({
            filename: 'index.html',
            template: './src/html/index.html',
            inject: 'body',
            chunks: ['index']
        }),
        new cleanWebpackPlugins(['dist']),
        new webpack.NamedModulesPlugin(), 
        new webpack.HotModuleReplacementPlugin()
    ],
    devServer: {
        contentBase: path.join(__dirname, 'dist'), 
        port: 8080,
        hot: true, 
    },
    mode: 'development'
};

直接修改index.js css即可更新

source-map

可以看到未被打包的源文件,方便定位bug

js: 需开启本地服务器
css

   module: {
        rules: [{
            test: /\.(css)$/,
            use: [{
                loader: 'style-loader',
                options: {
                    sourceMap: true
                }
            },
            {
                loader: 'css-loader',
                options: {
                    sourceMap: true
                }
            }
            ]
        }, {
            test: /\.(jpeg|png|jpg)$/,
            use: {
                loader: 'file-loader',
                options: {
                    outputPath: 'assets/imgs/',
                }
            }
        }, {
            test: /\.(html)$/,
            use: { loader: 'html-loader' }

        }]
    },

区分开发环境和线上环境

开发环境不需要压缩代码,生成环境需要,所以有必要分别配置

  • 使用webpack-merge 合并配置对象。如果是发布环境,就修改配置
// webpack.config.js
let isProduction = false; //是否发布环境

let baseConfig = {
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'js/[name].js'
    },
    module: {

    },
    plugins: [
        new webpack.DefinePlugin({  // 全局变量,在项目里的js都可以访问到
            isProduction: isProduction
        })
    ],

    mode: isProduction ? 'production' :'development',
    devtool: isProduction?'':'inline-source-map',
};


if (isProduction) { // 如果是发布环境就处理js
    baseConfig = merge(baseConfig,{ //
        module: { 
            rules:[{
                test: /\.js$/,
                exclude: /(node_modules)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env']
                    }
                }
            }]
        }
    })
} 

module.exports = baseConfig;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 28,804评论 1 45
  • 一直只是听说过vue.js很火,但是从来没有接触过,这次准备用它做个项目试试,顺便也学习一下前端开发,在网上试了很...
    delicacylee阅读 713评论 0 5
  • 初次接触前端,想给自己写的一个小东西添加一个好看的web页面,学习一下vue,记录一下vue的环境搭建步骤。 vu...
    三舍楼前阅读 416评论 0 0
  • 今天财务有一台电脑,进入财务的网站,有的文字不能正常显示, 看了半天的现象,发现不仅此网站有问题,百度网的logo...
    易锦风阅读 696评论 0 0
  • 就这样发生,触碰火花的一瞬间。 你我的爱情就在几万人中的眼神里, 我应该含蓄一点,你应该主动一点。 我前进一些,你...
    张铭小铄阅读 280评论 0 2

友情链接更多精彩内容