百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

轻量级H5 app开发实践之环境搭建

toyiye 2024-06-06 22:12 20 浏览 0 评论


上一篇文章主要介绍了我对这个项目的技术选型,这篇文章要上点干货啦,主要介绍项目开发环境的搭建,包含以下几个部分。

  • 项目目录结构设计
  • node版本和npm包选择与安装
  • webpack配置
  • 启动本地开发服务

项目目录结构设计

合理的目录结构能让开发人员非常清楚地知道各模块的存放位置,方便开发和维护。此项目我设计为多页面入口结构,分为3个主要部分:

  1. app/,存放nodejs服务相关代码;
  2. static/,存放客户端源代码;
  3. dist-xxx/, 存放客户端编译后可运行代码;

其他目录和配置都是为了服务以上三部分而制定的,具体如下:

app/ //node服务相关
  controllers/ //数据请求
  	home_api.js
	routes/ //路由配置
  views/ //页面模板
	app.js //服务入口
bin/ //服务启动
  www
build/ //构建配置
  webpack.config.js
config/ //项目全局配置
dist-myproject/  //编译后可运行代码
static/	//客户端源码
  assets/ //公共资源
  common/ //公共js模块
  modules/ //业务模块
  	shop/
  		index.js //入口js
			shop.html //入口页面模板
package.json
myproject-front.json //pm2启动配置

node版本和npm包选择与安装

nodejs 版本我选择的是10.15.3,也是我们现在项目在用的版本,原生就支持es7 的 async await语法,相对更稳定些,你也可以选择更高的版本,注意选择长期支持的稳定版本即可。

npm包主要是结合项目中使用到的,按需安装即可,这个项目主要围绕着三部分安装,分别是:koajs,vuejs,webpack ,具体如下:

{
    "name": "myproject",
    "version": "1.0.0",
    "type": "nodejs",
    "description": "myproject for koa",
    "main": "./app/app.js",
    "scripts": {
        "build": "webpack --config ./build/webpack.prod.config.js",
        "build-dev": "webpack --config ./build/webpack.dev.config.js",
        "start": "concurrently \"npm run webpack-start\" \"npm run start\""
    },
    "keywords": [
        "myproject"
    ],
    "author": "luorh",
    "license": "ISC",
    "browserslist": [
        "> 1%",
        "last 2 versions",
        "not ie <= 8"
    ],
    "dependencies": {
        "@koa/router": "9.4.0",
        "@vant/touch-emulator": "^1.2.0",
        "art-template": "^4.13.2",
        "axios": "^0.19.2",
        "core-js": "^3.6.5",
        "debug": "^3.1.0",
        "fastclick": "1.0.6",
        "fs-extra": "^9.0.1",
        "ip": "^1.1.5",
        "koa": "2.13.0",
        "koa-art-template": "1.1.1",
        "koa-bodyparser": "4.3.0",
        "koa-csrf": "^3.0.8",
        "koa-helmet": "^5.2.0",
        "koa-logger": "^3.2.0",
        "koa-onerror": "^4.1.0",
        "koa-session": "^6.0.0",
        "koa-views": "^6.3.0",
        "lodash": "^4.17.10",
        "log4js": "^2.7.0",
        "pm2-intercom": "^1.0.0",
        "qs": "6.5.1",
        "vant": "^2.10.2",
        "vue": "2.6.11",
        "vue-lazyload": "1.2.2",
        "vue-progressbar": "^0.7.5",
        "vue-router": "3.4.3",
        "vuex": "3.5.1"
    },
    "devDependencies": {
        "@babel/core": "^7.11.1",
        "@babel/plugin-proposal-class-properties": "^7.10.4",
        "@babel/plugin-transform-runtime": "^7.11.0",
        "@babel/preset-env": "^7.11.0",
        "@babel/preset-typescript": "^7.10.4",
        "@babel/runtime": "^7.11.2",
        "babel-loader": "^8.1.0",
        "babel-plugin-import": "^1.13.0",
        "concurrently": "^5.3.0",
        "css-loader": "^3.6.0",
        "file-loader": "^6.0.0",
        "friendly-errors-webpack-plugin": "^1.6.1",
        "glob": "^7.1.2",
        "gulp": "^3.9.1",
     
        "html-webpack-plugin": "^4.3.0",
        "html-webpack-tags-plugin": "^2.0.17",
        "mini-css-extract-plugin": "0.8.0",
        "nodemon": "^2.0.4",
        "optimize-css-assets-webpack-plugin": "^5.0.3",
        "postcss-css-variables": "^0.17.0",
        "postcss-cssnext": "^3.1.0",
        "postcss-import": "^12.0.1",
        "postcss-loader": "^3.0.0",
        "postcss-modules": "^1.1.0",
        "postcss-preset-env": "^6.7.0",
        "postcss-pxtorem": "^5.1.1",
        "postcss-safe-parser": "^4.0.2",
        "postcss-url": "^8.0.0",
        "style-loader": "^1.2.1",
        "terser-webpack-plugin": "^4.0.0",
        "url-loader": "^4.1.0",
        "vue-loader": "^15.9.3",
        "vue-template-compiler": "^2.6.11",
        "webpack": "^4.44.0",
        "webpack-bundle-analyzer": "^3.8.0",
        "webpack-cli": "^3.3.12",
        "webpack-dev-server": "^3.11.0",
        "webpack-merge": "^5.1.1"
    }
}

webpack配置

在这个项目中代码的构建打包全部使用webpack搞定,舍弃了以往的gulp+webpack的组合方式,具体分以下3个配置文件:

webpack.base.config.js //基础配置
webpack.prod.config.js //生产环境配置
webpack.dev.config.js //开发环境debug配置

上面提到,我们这个项目设计为多页面入口,为此我写了一段脚本来负责扫描项目中的页面模块,生成入口文件的json对象,具体如下:

		const SRC_PATH = path.resolve(__dirname, '../static/modules/'); //模块目录
    const moduleNames = fs.readdirSync(SRC_PATH) //获取模块数组
    const entryJs = {}, //入口js对象
          pluginTpls = [];//入口html模板,配合HtmlWebpackPlugin使用
    moduleNames.forEach(module => {
        // 收集入口文件
        if (fs.existsSync(path.join(SRC_PATH, `/${module}/index.js`))) {
            entryJs[module] = path.join(SRC_PATH, `/${module}/index.js`)
            // 收集html模板  生成HtmlWebpackPlugin 配置文件
            if (fs.existsSync(path.join(SRC_PATH, `/${module}/${module}.html`))) {
                pluginTpls.push(new HtmlWebpackPlugin(Object.assign({
                    template: path.join(SRC_PATH, `/${module}/${module}.html`),
                    filename: `${module}/index.html`,
                    chunks: [module],
                }, isEnvProduction
                    ? {
                        minify: {
                            removeComments: true,   // 移除注释
                            collapseWhitespace: true,   // 移除标签内的空格  SCRIPT, STYLE, PRE or TEXTAREA.除外
                            removeRedundantAttributes: true,
                            useShortDoctype: true,
                            removeEmptyAttributes: true,  // 移除标签空属性
                            removeStyleLinkTypeAttributes: true,
                            keepClosingSlash: true,
                            minifyJS: true,
                            minifyCSS: true,
                            minifyURLs: true,
                        },
                    }
                    : undefined)))
            } else {
                throw ('\033[31m错误:模块 [' + module + '] 未给出正确的html模板 '+module+'.html\033[0m');
            }
        } else {
            console.log('\033[33m警告:模块 [' + module + '] 未给出正确的入口文件 index.js\033[0m')
        }
    })

结合上述代码再细讲一下,该项目的 static/modules/目录下存放着每个业务的功能模块,可以是一个独立页面,也可以是一个vue +router 结构的 spa页面集,这里有个模块创建规范:每个模块的文件夹名称要求是英文小写,如:shop,如果需要多个单词拼接,是以 - 杠链接,如:order-list,在模块文件夹的根目录下必须有两个文件,分别是:index.js和对应模块名称的xxx.html模板文件,如:shop.html。了解这些后再去看上述代码应该会更清晰一些。

还有,webpack配置中还有 postcss(css预编译),webpack-dev-server(本地页面预览和热重启),具体完整配置我会在这系列文章完结后将代码上传到github供大家查阅。

启动本地开发服务

最后,所有环境配置都完成后 ,将配置命令集成在 package.json 的 scripts内,具体是:

"build": "webpack --config ./build/webpack.prod.config.js", //构建生产环境代码
"build-dev": "webpack --config ./build/webpack.dev.config.js", //构建未压缩的debug代码
"start": "concurrently \"npm run webpack-start\" \"npm run start\"" //启动本地开发服务

前两个命令好理解,根据需要执行就好,npm run start 内通过 concurrently 开启了两个进程分别启动了 webpack-dev-server(本地页面预览)和 nodejs api服务,其目的是为了方便你在即改了node层的代码又改了客户端的js代码时,可以进行同时热重启,很方便地进行调试。

小结

这一篇主要介绍了目录结构设计,node版本和npm包的选择和webpack 的主要配置,文中没有细讲基础类的知识点,如,node如何安装,webpack基本配置等,因为那些直接去官网按文档执行就好,我主要想表述的是如何将他们优雅的组织起来,以更好的服务项目,以达到高效且稳定。

后面的几篇文章我会继续分享在实际业务功能开发中遇到的一些问题,比如,如何兼容小程序,原生app,H5浏览器兼容等等,感谢阅读!

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码