webpack构建多页面react项目(webpack+typescript+react)
?目录介绍 ? src:里面的每个文件夹就是一个页面,页面开发相关的组件、图片和样式文件就存放在对应的文件夹下。 tpl:里面放置模板文件,当webpack打包时为html-webpack-plugin插件提供模板。 tsconfig.json:typescript的配置文件,需要自己新建并编写。 webpack.config.js:webpack的配置文件,需要自己新建并编写。 config:文件夹下的index.dev.js用来配置开发模块,index.js配置发布模块。将会在webpack.config.js中引用。index.dev.js是index.js的子集,index.js包含了所有的页面。 ?index.dev.js module.exports = { page2: { title: "hello world!",tpl: "index" } }; index.js module.exports = { page1: { title: "hello world!",tpl: "index" },page2: { title: "hello world!",tpl: "index" } }; ? npm初始化项目 执行npm init命令,填写完基本信息后会生成一个package.json文件,"dependencies"属性是在安装依赖包附带--save参数时生成的,“devDependencies”属性是在安装开发依赖包附带--save-dev参数时生成的。 npm init package.json文件 { "name": "react-demo","version": "1.0.0","description": "react+typescript+webpack项目","private": true,//设置为true,那么npm将拒绝发布它,防止私人存储库意外发布 "scripts": { // 自定义脚本,通过npm run执行脚本 "start": "webpack-dev-server --mode development --cfg dev",//启动web服务器,cfg是自定义参数,赋值为dev。 "build": "webpack --mode production" },"keywords": [ "react","typescript","webpack" ],"author": "chencong","license": "ISC","dependencies": { "clean-webpack-plugin": "^1.0.1","html-webpack-plugin": "^3.2.0","ts-loader": "^5.3.3","typescript": "^3.3.3","webpack": "^4.29.3","webpack-cli": "^3.2.3","webpack-dev-server": "^3.1.14","yargs": "^13.1.0" },"devDependencies": { "react": "^16.8.2","react-dom": "^16.8.2" } } ? 添加react npm install --save-dev react react-dom ? 添加typescript 安装typescript编译器和loader npm install --save typescript ts-loader ? 安装完成后需要编写配置文件,在项目中新建tsconfig.json文件。配置完后就该ts-loader登场了,在webpack.config.js中配置loader,将项目中所有的用typescript语法编写的文件都用ts-loader处理,处理的依据就是tsconfig.json文件。还有一点需要提一下,项目可以不用babel进行转码了,因为ts-loader已经帮我们处理了,tsconfig.json中“target”: “es5”就是转码成es5的配置,"jsx": "react"就是对jsx的支持,不需要用babel-preset-react进行转码。(typescript配置文档) { "version": "1.0.0","compilerOptions": { "baseUrl": "./",//解析非相对模块的基准目录 "paths": { //路径映射,如在文件中使用‘~/’相当于‘src/’ "~/*": ["src/*"] },"module": "esnext",//指定生成哪个模块系统的代码 "target": "es5",//生成es5的js文件 "jsx": "react",//在tsx文件里支持jsx "sourceMap": true,"moduleResolution": "node",//决定如何处理模块 "allowJs": true,//允许编译js文件 "strictNullChecks": false,//在严格的 null检查模式下, null和 undefined值不包含在任何类型里,只允许用它们自己和 any来赋值(有个例外, undefined可以赋值到 void) "lib": ["es2015","dom","es2015.promise"] //编译过程中需要引入的库文件的列表 },"include": ["src/**/*"],//编译包含在 src及其子目录下的所有匹配的文件 "exclude": ["dist","node_modules"] //编译时排除 dist、node_modules文件夹 } ? 添加webpack 执行以下命令添加webpack,使用webpack 4.X的命令行需要单独安装命令行工具,所以也要安装webpack-cli。html-webpack-plugin插件帮助我们在打包时根据模板生成html文件,clean-webpack-plugin插件会在项目打包前删除指定的文件,通常用来删除旧的打包文件。yargs包提供了获取命令行中参数的对象。 npm install --save webpack webpack-cli html-webpack-plugin clean-webpack-plugin yargs 接下来编写webpack的配置文件,在项目中新建配置文件webpack.config.js。(webpack文档) const path = require("path"); const argv = require("yargs").argv; //获取命令行中参数的对象 const HtmlWebpackPlugin = require("html-webpack-plugin"); const CleanPlugin = require("clean-webpack-plugin"); const webpack = require("webpack"); const isDev = argv.cfg && argv.cfg === "dev"; //是否为开发模式,如果输入yarn start执行"webpack-dev-server --mode development --cfg dev",argv.cfg获取参数的值为dev。 let compileConfig = "index"; if (isDev) { compileConfig = "index." + argv.cfg; } const buildConfig = require(`./config/${compileConfig}`); // 开发模式下,引入index.dev.js中的配置信息。生产模式下,引入index.js中的配置信息 const modules = Object.keys(buildConfig); const entry = Object.create(null); const htmlPlugins = []; if (modules.length > 0) { for (let srcModule of modules) { entry[srcModule] = path.resolve(__dirname,`./src/${srcModule}`); // 多页面应用webpack配置文件entry属性的值 htmlPlugins.push( // html-webpack-plugin插件生成html的配置 new HtmlWebpackPlugin({ title: buildConfig[srcModule]["title"],filename: `${srcModule}/index.html`,template: path.resolve(__dirname,"./tpl/index.html"),chunks: [srcModule] }) ); } } const config = { entry,output: { publicPath: "/dist/",filename: "[name].[hash].js",path: path.resolve(__dirname,"dist") }, ? 以上就是构建多页面应用的所有配置了,如有疑问或有更好的建议欢迎交流! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |