webpack 和 babel
1.webpack.config.js
var HtmlWebpackPlugin = require('html-webpack-plugin'); var path = require('path'); const htmlPlugin = new HtmlWebpackPlugin({ template: path.join(__dirname, './src/index.html'), // origin file filename: 'index.html' }) module.exports = { mode: 'development', // production development plugins: [htmlPlugin], module: { // 所有第三方模块的配置规则,loader配置 rules: [ { test: /\.js|jsx$/, use: 'babel-loader', exclude: /node_modules/ }, // 调用顺序从后面 css-loader 开始,再到 style-loader, ?modules 启用 css 模块化,只针对类名和id选择器 // localIdentName 自定义生成类名格式 // 取消模块化:global([.类名 | #id]) e.g. :global(.content) // 文件模块化后:local([.类名]) 是默认的 // 省略 node_modules 直接 import bootcss from 'bootstrap/dist/css/bootstrap.css' { test: /\.css$/, use: ['style-loader', 'css-loader'], exclude: /node_modules/ }, { test: /\.scss$/, use: ['style-loader', 'css-loader?modules&localIdentName=[path][name]-[local]-[hash:5]', 'sass-loader'], exclude: /node_modules/ }, { test: /\.ttf|woff|woff2|eot|svg$/, use: 'url-loader'}, // 处理字体 ] }, resolve: { extentions: ['.js', '.jsx', '.json'], // 扩展后缀名 alias: { //配置项目根目录 '@': path.join(__dirname, './src') } } }
2.package.join (创建 npm init -y)
{ "name": "react", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "webpack-dev-server --open --port 3000 --hot --host 127.0.0.1" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "babel-core": "^6.26.3", "babel-loader": "^8.0.6", "babel-plugin-transform-runtime": "^6.23.0", "babel-preset-env": "^1.7.0", "babel-preset-react": "^6.24.1", "babel-preset-stage-0": "^6.24.1", "css-loader": "^3.4.2", "file-loader": "^5.1.0", "html-webpack-plugin": "^3.2.0", "style-loader": "^1.1.3", "url-loader": "^3.0.0", "webpack": "^4.42.0", "webpack-cli": "^3.3.11", "webpack-dev-server": "^3.10.3" } }
3..babelrc
{ "presets": ["env", "stage-0", "react"], "plugins": ["transform-runtime"] }
4. devServer
devServer: { //配置开发服务器 host: "0.0.0.0", //是否启用热加载,就是每次更新代码,是否需要重新刷新浏览器才能看到新代码效果 hot: true, //服务启动端口 port: "8080", //是否自动打开浏览器默认为false open: false, //配置http代理 proxy: { "/api": { //如果ajax请求的地址是http://192.168.0.118:9999/api1那么你就可以在jajx中使用/api/api1路径,其请求路径会解析 // http://192.168.0.118:9999/api1,当然你在浏览器上开到的还是http://localhost:8080/api/api1; target: "http://192.168.0.118:9999", //是否允许跨域,这里是在开发环境会起作用,但在生产环境下,还是由后台去处理,所以不必太在意 changeOrigin: true, pathRewrite: { //把多余的路径置为'' "api": "" } }, "/api2": {//可以配置多个代理,匹配上那个就使用哪种解析方式 target: "http://api2", // ... } } },
5.跨域配置
proxy: [ { context: ['/user','/apis'], //使用context属性,可以把多个代理到同一个target下 target: 'https://rsp.jd.com/', //把用 user 和 apis 开头的接口代理到 https://rsp.jd.com/域名下 secure: false, //默认不支持运行在https上,且使用了无效证书的后端服务器,这里设置为true,可以支持 changeOrigin: true,//如果接口跨域,需要进行这个参数配置 pathRewrite: {'^/apis': ''},//由于apis开头的路径,是人为添加方便区分哪些接口要代理的,所以这里去掉apis headers: { //设置请求头 origin: 'https://plus.m.jd.com', //请求接口限制来源,所以要改动请求源 host: 'rsp.jd.com',//设置请求头的host referer: 'https://plus.m.jd.com/index'//设置请求头的referer,因为后端接口会有限制 } } ]
6.vue.config.js
// vue.config.js module.exports = { // 选项... // 当使用基于 HTML5 history.pushState 的路由时; // 当使用 pages 选项构建多页面应用时。 baseUrl:"", // 当运行 vue-cli-service build 时生成的生产环境构建文件的目录。注意目标目录在构建之前会被清除 (构建时传入 --no-clean 可关闭该行为)。 outputDir:"webApp", // 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录。 assetsDir:"assets", // 指定生成的 index.html 的输出路径 (相对于 outputDir)。也可以是一个绝对路径。 indexPath:"index.html", // 默认情况下,生成的静态资源在它们的文件名中包含了 hash 以便更好的控制缓存。然而,这也要求 index 的 HTML 是被 Vue CLI 自动生成的。如果你无法使用 Vue CLI 生成的 index HTML,你可以通过将这个选项设为 false 来关闭文件名哈希。 filenameHashing:true, // 多页面 pages:undefined, // 编译警告 lintOnSave:false, // 是否使用包含运行时编译器的 Vue 构建版本。设置为 true 后你就可以在 Vue 组件中使用 template 选项了,但是这会让你的应用额外增加 10kb 左右。 runtimeCompiler:false, // 默认情况下 babel-loader 会忽略所有 node_modules 中的文件。如果你想要通过 Babel 显式转译一个依赖,可以在这个选项中列出来。 transpileDependencies:[], // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 productionSourceMap:false, // 设置生成的 HTML 中 <link rel="stylesheet"> 和 <script> 标签的 crossorigin 属性。需要注意的是该选项仅影响由 html-webpack-plugin 在构建时注入的标签 - 直接写在模版 (public/index.html) 中的标签不受影响。 crossorigin:undefined, // 在生成的 HTML 中的 <link rel="stylesheet"> 和 <script> 标签上启用 Subresource Integrity (SRI)。如果你构建后的文件是部署在 CDN 上的,启用该选项可以提供额外的安全性。需要注意的是该选项仅影响由 html-webpack-plugin 在构建时注入的标签 - 直接写在模版 (public/index.html) 中的标签不受影响。另外,当启用 SRI 时,preload resource hints 会被禁用,因为 Chrome 的一个 bug 会导致文件被下载两次。 integrity:false, // 反向代理 devServer:{ // devServer: { // proxy: { // '/api': { // target: '1', // ws: true, // changeOrigin: true // } // } // } } }