手把手教你用hbuilderx图形化界面创建uniapp项目爆改支持cli指令发行

1,029 阅读3分钟

用hbuilderx图形化界面创建uniapp项目爆改支持cli指令发行

1.需求

原有项目只做小程序发布则使用了hbuilderx图形化创建,现在需要用该项目的h5版本,希望能通过jenkins统一打包发行,所以需要命令行发布

2.过程

1.package.json文件中的scripts中注册命令行

"h5-dev": "cd %HBUILDERX_PATH%/plugins/uniapp-cli/ && cross-env UNI_INPUT_DIR=$INIT_CWD/ UNI_OUTPUT_DIR=$INIT_CWD/unpackage/dist/dev/h5 UNI_PLATFORM=h5 NODE_ENV=development node bin/uniapp-cli.js",
​
"h5-test": "cd %HBUILDERX_PATH%/plugins/uniapp-cli/ && cross-env UNI_INPUT_DIR=$INIT_CWD/ UNI_OUTPUT_DIR=$INIT_CWD/unpackage/dist/build/h5 UNI_PLATFORM=h5 NODE_ENV=test node bin/uniapp-cli.js",
​
"h5-prod": "cd %HBUILDERX_PATH%/plugins/uniapp-cli/ && cross-env UNI_INPUT_DIR=$INIT_CWD/ UNI_OUTPUT_DIR=$INIT_CWD/unpackage/dist/build/h5 UNI_PLATFORM=h5 NODE_ENV=production node bin/uniapp-cli.js",

注释:

%HBUILDERX_PATH% : 需要在环境变量中注册HBUILDERX_PATH,指向HbuilderX中的绝对地址,例如我现在电脑的D:/xxx/xxx/HBuilderX.3.99.2023122611/HBuilderX

cross-env:通过npm i cross-env来区分环境

NODE_ENV=development:当前指令对应环境

UNI_INPUT_DIR=$INIT_CWD/ :uni的输入地址

UNI_OUTPUT_DIR=$INIT_CWD/unpackage/dist/dev/h5:uni的输出地址

其中dist/dev/h5,dist/build/h5是区分是项目是否为发行项目(build),如果是dev中未对代码进行压缩

UNI_PLATFORM=h5:编译出来的项目为h5项目

node bin/uniapp-cli.js:执行uniapp-cli.js文件

2.h5的router中的base地址根据环境动态变化

注意:无法用过直接修改vue.config.js中的publicPath实现,需要通过修改manifest文件的方式实现

//在vue.config.js中
const fs = require("fs");
const path = require("path");
​
// 获取当前环境
const isProd = process.env.NODE_ENV === "production";
const manifestPath = path.resolve(__dirname, "./manifest.json");
​
// 读取 manifest.json 文件
fs.readFile(manifestPath, "utf8", (err, data) => {
  if (err) {
    return console.error("读取 manifest.json 文件失败:", err);
  }
​
  // 修改 base 路径
  let manifest = JSON.parse(data);
  manifest.h5.router.base = isProd
    ? "/path-prod/"
    : "/path-dev/";
​
  // 写回文件
  fs.writeFile(
    manifestPath,
    JSON.stringify(manifest, null, 2),
    "utf8",
    (err) => {
      if (err) {
        return console.error("写入 manifest.json 文件失败:", err);
      }
      console.log("manifest.json 更新成功!");
    }
  );
});
​

注意:manifest文件可能parse失败,需要将其中的注释语句删掉

3.结果

运行npm run h5-dev,打开uniapp的h5运行模式

运行npm run h5-test,在dist/build/h5中输出测试/开发状态代码

运行npm run h5-prod,在dist/build/h5中输出生产状态代码

项目转化为cli

1.新建一个cli构建的项目(nvm 切换到原项目的node版本)

vue create -p dcloudio/uni-preset-vue my-project

可以先npm i npm run serve npm run build看项目有无问题 如果跑不起来npm install postcss@8 postcss-loader@5 autoprefixer@10

2.迁移

将旧项目中的所有文件复制,粘贴到新项目中的src里,有冲突的直接替换

3.npm install

在package.json中,将原项目所有用到的依赖都复制过来,如果用到了sass,less,记得下对应node版本下的node-sass和sass-loader

npm insatll

4.根据环境打包

cross-env

"build:h5-prod": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build",
"build:h5-dev": "cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-build",

5.如果删掉node_modules和package-lock.json后npm i报错或运行报错

一般是因为devDependencies,或者dependices依赖有多种版本的话,例如^x.x.x,那么npm可能会下载到两个冲突的版本

所以可以选择yarn来进行依赖包管理(更兼容)

6.对打包好的文件进行操作(少部分会用到)

//vue.config.js
//保留resources在原来的目录结构中,后端不用改构建命令
 configureWebpack: {
    plugins: [
      // H5
      !isMpPlatform &&
        new CopyWebpackPlugin({
          patterns: [
            {
              from: path.resolve(__dirname, "src/resources"),
              to: "resources",
            },
          ],
        }),
    ].filter(Boolean),
  },
//因为resources文件是静态资源,只有h5打包的时候会布到服务器上,所以当是微信环境打包时不将其打包进小程序的主包中
chainWebpack: (config) => {
    if (isMpPlatform) {
      config.plugin("ignore-resources").use({
        apply: (compiler) => {
          compiler.hooks.emit.tap("IgnoreResourcesPlugin", (compilation) => {
            for (const filename in compilation.assets) {
              if (filename.includes("resources")) {
                delete compilation.assets[filename];
              }
            }
          });
        },
      });
    }
  },