webpack 前端开发环境 webpack-dev-server多入口访问路由要加html后缀

安装webpack各种包

指定版本是因为webpack-cli 和webpack-dev-server不兼容

npm init

npm i webpack --save-dev

npm i webpack-cli@3.3.12 -D

npm i webpack-dev-server --save-dev

npm i webpack-merge --save-dev

npm i clean-webpack-plugin --save-dev

npm i html-webpack-plugin --save-dev

npm i copy-webpack-plugin

npm i --save-dev yargs

npm i --save-dev config-yargs

npm i --save-dev css-loader

npm i --save-dev style-loader

npm i -D cors-proxy-webpack-plugin

新建一个文件夹,命名为webpack-config

里面建立4个js文件

webpack.base.config.js

// 公共环境的配置
const path = require(\'path\')
const HtmlWebpackPlugin = require(\'html-webpack-plugin\');


module.exports = {
    entry: \'./src/index.ts\', //入口文件
    //output 配置输出 输出的文件名叫做app.js 输出目录使用默认的dist目录
    output: {
        filename: \'static/app.js\',
        // path: path.join(__dirname, \'..\', \'dist\')
    },
    externals: {
        jquery: \'jQuery\',
        // winddata: \'wind-data\',
        // windbundle: \'wind-bundle\',
    },

    resolve: {
        //指定三个扩展名
        extensions: [\'.js\', \'.ts\', \'.tsx\']
    },
    //因为引用了 typescript 所以这里引用ts-loader
    module: {
        rules: [
            {
                test: /\.tsx?$/i, //ts-loader的正则就是以 ts tsx结尾的文件
                use: [{
                    loader: \'ts-loader\'
                }],
                exclude: /node_modules/ //排除node_modules下的文件
            },{
                test: /\.css$/,
                use: [\'style-loader\', \'css-loader\']
            }
        ]
    },
    plugins: [
        //通过一个模板帮我们生成网站的首页,并且把输出的文件自动嵌入到这个文件中
        new HtmlWebpackPlugin({
            template: \'./src/tpl/index.html\',
            // filename: \'index.html\'

        })

    ]

}

webpack.config.js

//所有配置文件的入口
const {merge} = require(\'webpack-merge\'); //插件 把两个webpack文件合并
const baseConfig = require(\'./webpack.base.config\');
const devConfig = require(\'./webpack.dev.config\');
const proConfig = require(\'./webpack.prod.config\');
//如果是开发环境 就选择开发环境的配置否则选择生产环境的配置
let config = process.NODE_ENV === \'development\' ? devConfig: proConfig;

//将baseConfig和config合并
module.exports = merge(baseConfig, config);

webpack.dev.config.js

// 开发环境的配置
module.exports = {
    //开启 source-map, 
    //cheap 表示 source-map忽略文件的列信息, 调试的时候文件的列信息是没有用的
    //module 表示 定位到我们的ts源码 而不是经过loader转译过的js源码
    //eval-source-map 表示会将source-map以dataURL的形式打包到文件中
    //他的重编译速度是很快的 不用担心性能问题
    devtool: \'cheap-module-eval-source-map\'
}

webpack.prod.config.js

const path = require(\'path\')
// 生产环境的配置
const { CleanWebpackPlugin} = require(\'clean-webpack-plugin\');
const CopyWebpackPlugin = require(\'copy-webpack-plugin\');
//这个插件的作用是 在每次成功构建之后帮我们清空dist目录
//因为有的时候为了避免缓存问题, 我们需要在文件后加入哈希,在多次构件后,会生成很多无用文件
module.exports = {
    plugins: [
        new CleanWebpackPlugin(),
        new CopyWebpackPlugin({
            patterns: [
                { from: \'assets\', to: \'assets\' },
            ]
        })
    ],
    //devtool: \'source-map\',

}

package.json里

  "scripts": {
    "start": "webpack-dev-server --mode=development --config ./webpack-config/webpack.config.js",
    "prod": "webpack --mode=production --config ./webpack-config/webpack.config.js",
 ...
}

CORS问题

https://developer.aliyun.com/mirror/npm/package/cors-proxy-webpack-plugin

webpack打包多入口页面时,访问非index页面,要加上文件名后缀,否则访问不到。

在dist文件部署上去之后,可以通过配置nginx的路由,来省略文件名后缀。

在开发模式,使用webpack-dev-server时候,若打包生成index.html和login.html,

访问login.html的路由一定是: http://localhost:8086/login.html,不能是http://localhost:8086/login 或 http://localhost:8086/#/login