13、webpack跨域处理

作者: 圆梦人生 | 来源:发表于2019-08-08 16:53 被阅读2次

前端发送请求到后台会碰到跨域请求,在webpack中可以有以下方式处理:

  • 1、配置代理(需要安装webpack-dev-server)
yarn add webpack-dev-server -D

module.exports = {
  devServer: {
    proxy: {
      //'/api': 'http://localhost:3000'
      '/api/*': {
         target: 'http://localhost:3000/api',
           pathRewrite: {'^/api/*': ''}
       }
    }
  }
}
  • 2、前端挡板
module.exports = {
  devServer: {
    before(app){
      app.get('/api/list', (req, res)=>{
        res.json({name: 'mockData'});
      })
    }
  }
}

server.js(使用node启动一个后台服务, vscode,右击-Run Code启动服务)

// 使用node开启服务端
let express = require('express');
let app = express();
app.get('/api/list', (req, res)=>{
    res.json([
        {name: '1'},
        {name: '2'},
        {name: '3'},
        {name: '4'},
        {name: '5'}
    ])
})

app.listen(3000);

index.js(前端发送请求代码)

// 发送请求:
let xhr = new XMLHttpRequest();

xhr.open('GET', '/api/list', true);

xhr.onload = function(){
    console.log('响应数据', xhr.response);
}
xhr.send();

webpack.config.js完整配置

//  webpack是node写出来的, 需要node的写法
let path = require('path');
// path.resolve 相对路径转成绝对路径
// console.log(path.resolve('dist'));
// 以当前目录
// console.log(__dirname);

// html-webpack-plugins 插件
let HtmlWebpackPlugins = require('html-webpack-plugin');

// 清除插件
let { CleanWebpackPlugin } = require('clean-webpack-plugin');

// 复制插件
let copyWebpackPlugin = require('copy-webpack-plugin');

// 署名插件
let webpack = require('webpack');

// webpack相关配置
module.exports = {
    // 开发服务的配置
    devServer: {
        // 端口,默认8080
        port: '8099',
        // 进度条
        progress: true,
        // 启动后访问目录,默认是项目根目录,这个设置到打包后目录
        contentBase: './build',
        // 启动压缩
        //compress: true
        // 1、挡板
        before(app){
            app.get('/api/list', (req, res)=>{
                res.json({name: 'mockData'});
            })
        },
        // 2、代理
        // proxy: {
        //     //'/api': 'http://localhost:3000'
        //     '/api/*': {
        //         target: 'http://localhost:3000/api',
        //         pathRewrite: {'^/api/*': ''}
        //     }
        // }
    },
    // 模式,2种:生产模式(production)和开发模式(development)
    // 开发模式不压缩打包后代码,生产模式压缩打包后代码
    mode: 'production',
    // 1、source-map:产生文件,产生行列
    // devtool: 'source-map',
    // 2、eval-source-map:不产生文件,产生行类
    //devtool: 'eval-source-map',
    // 3、cheap-source-map:产生文件,不产生列
    //devtool: 'cheap-module-source-map',
    // 4、cheap-module-eval-source-map:不产生文件,不产生列
    //devtool: 'cheap-module-eval-source-map',

    // 监听
    // watch: true,
    // watchOptions: {
    //     poll: 1000, // 每秒询问多少次
    //     aggregateTimeout: 500,  //防抖 多少毫秒后再次触发
    //     ignored: /node_modules/ //忽略时时监听
    // },

    // 入口,表示从哪里开始打包
    entry: {
        home: './src/index.js'
    }, 
    // 表示出口(输出后文件相关配置)
    output: {   
        // 打包后的文件名 多入口根据入口名称生成
        filename: 'build.js',  
        // 输出后的路径(必须是一个绝对路径)
        path: path.resolve(__dirname, 'dist')
    },
    // 插件配置
    plugins: [
        new HtmlWebpackPlugins({
            // 模板位置
            template: 'index.html',
            // 文件名
            filename: 'index.html'
        }),
        // 清除插件
        // new CleanWebpackPlugin(); // 默认删除打包目录
        new CleanWebpackPlugin({
            outputPath: './dist'
        }),
        // 复制
        new copyWebpackPlugin([
            { from: './src/app.json', to: './' }
        ]),
        // 署名插件
        new webpack.BannerPlugin('by SM')
    ],
    module: {
        // loader
        rules: [
            {
                test: /\.js$/, //匹配js文件
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: [
                            '@babel/preset-env'
                        ]
                    }
                }
            }
        ]
     }
}

相关文章

网友评论

    本文标题:13、webpack跨域处理

    本文链接:https://www.haomeiwen.com/subject/olzxjctx.html