webpack 前端开发环境
安装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-dev-server多入口访问路由要加html后缀
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