用 webpack 创建项目后,我们需要对 Webpack 进行配置来支持更复杂的业务要求。
1、Webpack 配置支持 ie,新增 .browserslistrc 文件
// .browserslistrc[production]> 1%ie 9[modern]last 1 chrome versionlast 1 firefox version[ssr]node 12
2、让 Webpack 支持 JSX、JS、TS、TSX,加入 ESLint 检查,支持 SASS。node 依赖单独打包,支持多页面,合并共用文件。
const ESLintWebpackPlugin = require('eslint-webpack-plugin')const path = require('path')const MiniCssExtractPlugin = require('mini-css-extract-plugin')const HtmlWebpackPlugin = require('html-webpack-plugin')const mode = 'production'module.exports = {mode,// 多页面entry: {main: './src/index.js',admin: './src/admin.js',obb: './src/obb.js'},resolve: {alias: {'@': path.resolve(__dirname, './src/')},extensions: ['.ts', '.js', '.jsx','.tsx'],},plugins: [new ESLintWebpackPlugin({// 增加什么后缀就检查什么文件extensions: ['.js', '.jsx', '.ts', '.tsx']}),// build 后分离出 css 文件mode === 'production' && new MiniCssExtractPlugin({filename: '[name].[contenthash].css'}),// build 后分离出 html 文件new HtmlWebpackPlugin({filename: 'index.html',chunks: ['index']}),new HtmlWebpackPlugin({filename: 'admin.html',chunks: ['admin']}),new HtmlWebpackPlugin({filename: 'obb.html',chunks: ['obb']})].filter(Boolean),// build 后的 js 文件 hash 重命名output: {filename: '[name].[contenthash].js'},// 优化运行时配置optimization: {// 运行时runtime文件(webpack配置)单独打包, index.js 不变则不会生成新的 main.js,只更新 runtime.js,节省用户带宽。runtimeChunk: 'single',splitChunks: {cacheGroups: {vendor: {// 优先级priority: 10,minSize: 0, // 如果不写0,react 文件尺寸太小会被跳过test: /[\\/]node_modules[\\/]/, // 为了匹配 node_modulesname: 'vendors', // 文件名chunks: "all" // all 表示同步加载和异步加载,async 表示异步加载,initial 表示同步加载// 这三行的意思是把两种加载方式的来自 node_modules 目录文件打包为 vendors.xxx.js, vendors 是第三方的意思},// 多页面共用文件配置commons: {priority: 5,minSize: 0,// 共用文件被至少两个文件引用了minChunks: 2,chunks: "all",name: 'commons'}}}},module: {rules: [{test: /\.[jt]sx?$/,exclude: /(node_modules|bower_components)/,use: {loader: 'babel-loader',options: {presets: [['@babel/preset-env'],['@babel/preset-react', {runtime: 'classic'}],['@babel/preset-typescript']]}}},// webpack 配置 sass{test: /\.s[ac]ss$/i,use: [// css支持导出, 给 JS 读取mode === 'production' ? MiniCssExtractPlugin.loader : 'style-loader',{loader: 'css-loader',options: {modules: {compileType: 'icss'}}},{loader: "sass-loader",// sass 自动导入全局,不用每个文件写import scssoptions: {additionalData: `@import "~@/scss-vars.scss";`,sassOptions: {includePaths: [__dirname]}}}]}]}}
3、加入 ESLint 检查文件。
// .eslintrc.jsmodule.exports = {extends: ['react-app'],rules: {// 'react/jsx-users-react': [2],// 提示要在 jsx 里手动引入 React'react/react-in-jsx-scope': [2]},// 引入 TS 检查overrides: [{files: ['*.ts', '*.tsx'],parserOptions: {project: './tsconfig.json'},extends: ['airbnb-typescript'],rules: {'@/typescript-eslint/object-curly-spacing': [0],'import/prefer-default-export': [0]}}]}
4、创建 tsconfig.json 文件并配置 TS
tsc --init
{"compilerOptions": {/* Visit https://aka.ms/tsconfig.json to read more about this file *//* Basic Options */// "incremental": true, /* Enable incremental compilation */"target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */// "lib": [], /* Specify library files to be included in the compilation. */// "allowJs": true, /* Allow javascript files to be compiled. */// "checkJs": true, /* Report errors in .js files. */"jsx": "react", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */// "declaration": true, /* Generates corresponding '.d.ts' file. */// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */// "sourceMap": true, /* Generates corresponding '.map' file. */// "outFile": "./", /* Concatenate and emit output to single file. */// "outDir": "./", /* Redirect output structure to the directory. */// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */// "composite": true, /* Enable project compilation */// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */// "removeComments": true, /* Do not emit comments to output. */// "noEmit": true, /* Do not emit outputs. */// "importHelpers": true, /* Import emit helpers from 'tslib'. */// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). *//* Strict Type-Checking Options */"strict": true, /* Enable all strict type-checking options. */"noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */// "strictNullChecks": true, /* Enable strict null checks. */// "strictFunctionTypes": true, /* Enable strict checking of function types. */// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. *//* Additional Checks */// "noUnusedLocals": true, /* Report errors on unused locals. */// "noUnusedParameters": true, /* Report errors on unused parameters. */// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */// "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results *//* Module Resolution Options */// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */// "typeRoots": [], /* List of folders to include type definitions from. */// "types": [], /* Type declaration files to be included in compilation. */// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. *//* Source Map Options */// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. *//* Experimental Options */// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. *//* Advanced Options */"skipLibCheck": true, /* Skip type checking of declaration files. */"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */}}
