前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >原生小程序之工程化探索

原生小程序之工程化探索

作者头像
疯狂的技术宅
发布2020-12-31 11:33:55
7990
发布2020-12-31 11:33:55
举报
文章被收录于专栏:京程一灯京程一灯

前言

习惯用webpack对项目开发工程化,接触小程序后,稍微有点不适应,市面上有taro等优秀的小程序框架可以使用,由于负责项目历史背景,而无法大规模改造,因此只能做一些简单的工程化方案

规范代码

  • 配置eslint
  • vscode 安装插件 eslint
  • 配置husky,利用git commit 钩子进行 eslint检查,检测不通过不能提交代码

1.package.json

代码语言:javascript
复制
"lint-staged": {
    "**/*.(js)": [
      "pretty-quick --staged",
      "eslint --ext .js",
      "git add"
    ],
    "run/*": [
      "git rm --cached"
    ]
  },
  "husky": {
    "hooks": {
      "pre-commit": "npm run build && git add . && lint-staged"
    }
  }

2.配置 .eslintrc

代码语言:javascript
复制
module.exports = {
  root: true,
  parser: 'babel-eslint',
  parserOptions: {
    sourceType: 'module',
  },
  env: {
    browser: true,
    node: true,
    es6: true,
  },
  extends: 'eslint:recommended',
  plugins: ['import'],
  rules: {
    'arrow-body-style': [2, 'as-needed'],
    'wrap-iife': [2, 'inside'],
    camelcase: [
      0,
      {
        properties: 'always',
        ignoreDestructuring: true,
      },
    ],
    'no-var': 2,
    'one-var': [2, 'never'],
    'no-undef-init': 2,
    'default-case': 2,
    'prefer-template': 0,
    'no-useless-concat': 2,
    'no-multi-str': 2,
    'no-new-object': 2,
    'object-shorthand': [2, 'always'],
    'prefer-object-spread': 2,
    'no-array-constructor': 2,
    'max-params': [2, 6],
    'prefer-rest-params': 2,
    'no-useless-constructor': 2,
    'no-eval': 2,
    'no-throw-literal': 2,
    'import/no-unresolved': [2, { commonjs: true, amd: true }],
    'import/namespace': 2,
    'import/default': 2,
    'import/export': 2,
    'no-unused-vars': [
      'error',
      {
        vars: 'all',
        args: 'after-used',
        ignoreRestSiblings: false,
      },
    ],
  },
  globals: {
    wx: true,
    App: true,
    Page: true,
  },
};

3.配置项目文件 .vscode/settings.json,保存时自动eslint检查

代码语言:javascript
复制
{
  "files.associations": {
    "*.wxml": "xml",
  },
  "eslint.enable": true,
  "eslint.options": {
    "extensions": [".js"]
  },
  "eslint.validate": ["javascript"],
  "eslint.run": "onSave"
}

格式化代码-prettier

1.安装 prettier、pretty-quick 及 配置 .prettierrc

代码语言:javascript
复制
{
  "printWidth": 120,
  "singleQuote": true,
  "tabWidth": 2,
  "useTabs": false,
  "trailingComma": "es5",
  "insertPragma": false,
  "endOfLine": "lf",
  "semi": true,
  "trailingCommas": "es5",
  "arrowParens": "avoid",
  "overrides": [
    {
      "files": "*.wxml",
      "options": {
        "parser": "html"
      }
    }
  ]
}

2.配置项目 .vscode/settings.json,保存时,自动格式化

代码语言:javascript
复制
{
  "editor.formatOnSave": true
}

单元测试 - Jest

1.安装 jest、@babel/core、@babel/preset-env、babel-jest

2.配置package.json

代码语言:javascript
复制
"scripts": {
    "test": "jest ./test/index.test.js --coverage"
}

3.编辑 .babelrc

代码语言:javascript
复制
{
  "presets": ["@babel/preset-env"]
}

4.创建 test 测试文件夹

  • 创建 index.test.js
代码语言:javascript
复制
require('./unit/xxx.test.js');

5.编写测试脚本

代码语言:javascript
复制
import { sum } from '../util.js';
// case1
describe('函数单元测试: sum函数', () => {
  test('adds 1 + 2 to equal 3', () => {
    expect(sum(1, 2)).toBe(3);
  });
});

注入环境变量

方案一:rollup

1.安装 rollup、@rollup/plugin-replace

2.配置 package.json

代码语言:javascript
复制
"scripts": {
    "dev": "rollup -c --environment NODE_ENV:dev",
    "build": "rollup -c --environment NODE_ENV:prod",
}

3.git commit时,自动切换回build环境

代码语言:javascript
复制
"lint-staged": {
    "**/*.(js)": [
      "pretty-quick --staged",
      "eslint --ext .js",
      "git add"
    ],
    "run/*": [
      "git rm --cached"
    ]
  },
  "husky": {
    "hooks": {
      "pre-commit": "npm run build && git add . && lint-staged"
    }
  }

4.创建环境基础文件 env_base.js(勿动

代码语言:javascript
复制
// 环境变量,勿动
export default CUR_ENV;

5.rollup.config.js 配置文件

代码语言:javascript
复制
import replace from '@rollup/plugin-replace';
export default {
  input: 'env_base.js',
  output: {
    file: 'env.js',
  },
  plugins: [
    replace({
      include: 'env_base.js',
      exclude: 'node_modules/**',
      CUR_ENV: JSON.stringify(process.env.NODE_ENV), //注入环境变量
    }),
  ],
};

6.npm run dev / build,生成env.js

7.业务代码引入 env.js,获取到注入的环境变量,从而区分环境

方案二:node

  • 方案一:需要额外创建一个基础文件env_base.js,同时还需要集成 rollup,对于轻量级应用,这样不好!
  • 方案二:利用node基础能力,直接生成当前环境变量文件 env.js,去除rollup框架,降低技术移植成本

1.环境切换命令

代码语言:javascript
复制
"scripts": {
    "dev": "NODE_ENV=dev node ./set-env.js",
    "build": "NODE_ENV=prod node ./set-env.js"
},

2.git commit时,自动切换回build环境

代码语言:javascript
复制
"lint-staged": {
    "**/*.(js)": [
      "pretty-quick --staged",
      "eslint --ext .js",
      "git add"
    ],
    "run/*": [
      "git rm --cached"
    ]
  },
  "husky": {
    "hooks": {
      "pre-commit": "npm run build && git add . && lint-staged"
    }
  }

3.切换脚本(set-env.js)

代码语言:javascript
复制
// 切换环境
const { createWriteStream } = require('fs');
const { resolve } = require('path');
// 当前环境变量
const CUR_ENV = process.env.NODE_ENV || 'prod';
// 要写入的内容
const content = `const CUR_ENV = '${CUR_ENV}';
export default CUR_ENV;
`;
// 创建流
const fileName = resolve(__dirname, './env.js');
const ws = createWriteStream(fileName, {
  encoding: 'utf8',
  autoClose: true,
});
ws.on('open', function () {
  console.log(`正在设置环境变量....`);
});
ws.on('finish', function () {
  console.log(`设置环境变量成功: ${CUR_ENV || '线上环境'}`);
  process.exit();
});
ws.on('error', function () {
  process.exit(1);
});
ws.write(content);
ws.end();

4.npm run dev/build,生成 env.js 文件,并导出环境变量

代码语言:javascript
复制
const CUR_ENV = 'dev';// 'prod',
export default CUR_ENV;

5.业务代码引入 env.js,获取到注入的环境变量,从而区分环境


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端先锋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 规范代码
  • 格式化代码-prettier
  • 单元测试 - Jest
  • 注入环境变量
    • 方案一:rollup
      • 方案二:node
      相关产品与服务
      云开发 CloudBase
      云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档