Creator如何去除babel转译带来的严格模式?

在项目中使用了import,预览运行一切顺利,但到真机就报错,因为有些只读变量被修改,因此猜测是因为import被转译自动加上了严格模式。百度一番发现可以npm安装babel-plugin-transform-remove-strict-mode来解决,但是这个到底该装在哪呢?求论坛大佬们指教

写个插件,把构建出来的js文件的“use strict”字符串删除掉

这方法感觉有点粗暴~

没人知道吗?如果只能删掉"use strict",那构建出来的js文件在哪里啊?求指教

我选择直接换掉整个脚本打包流程 :crazy_face:
打包流程为先用cocos正常打包来生成资源,然后用下面的rollup配置编译整个项目脚本
没有你要的去掉 use strict,自己找下插件吧 :grin:
以下rollup.config.js代码仅在3.5.1版本使用
cocos打包参数为:

  • 开启md5cache
  • 开启首包分包
/* eslint-disable no-undef */
import ts from "@rollup/plugin-typescript"
import glob from "glob";
import fs from "fs-extra";
import { nodeResolve } from '@rollup/plugin-node-resolve';
import replace from '@rollup/plugin-replace'
import { terser } from 'rollup-plugin-terser';

export default async function(){
  const env = process.env.NODE_ENV || "development";
  const version = process.env.version || "1.0.0";

  const outputPlugins = []

  if (env === "production"){
    outputPlugins.push(terser({
      compress:{
        drop_console: true,
      },
      output: {
        comments: false
      },
    }))
  }

  const outputFilePath = await findOutputFileName()
  console.log(outputFilePath)

  const config = {
    input: "entrypoint.js",
    output: {
      format: "system",
      file: outputFilePath,
      plugins: outputPlugins,
      name: "virtual:///prerequisite-imports/start-scene"
    },
    external: ["cc"],
    plugins:[
      createEntryPointPlugin(),
      cocosUUIDPlugin(),
      ts({
        tsconfig: "tsconfig.rollup.json",
      }),
      nodeResolve(),
      replace({
        preventAssignment: true,
        'process.env.NODE_ENV': JSON.stringify(env),
      })
    ]
  }
  return [config]
}

function createEntryPointPlugin() {
  return {
    name: "create-entry-point",
    resolveId(source) {
      if (source === "entrypoint.js") {
        return source;
      }
      return null;
    },
    async load(id) {
      if (id === "entrypoint.js") {
        const files = await Promise.all([
          ***所有的cocos component放这里,其他的非组件ts脚本会自动引入***
          ***目录***
          fetchCode("components"),
          ***单个文件***
          ["assets/scripts/Launcher.ts"]
        ]);
        const imports = files.flat().map((file) => `import "./${file}"`);
        const result = [
          ***js插件放这里***
          // `import "./assets/scripts/global.js"`,
          imports
        ];
        return result.flat().join("\n");
      }
      return null;
    },
  };
}

async function fetchCode(base){
  return new Promise((resolve, reject) => {
    glob(`assets/scripts/${base}/**/!(*.d).ts`, function (err, files) {
      if (err) {
        reject(err);
      } else {
        resolve(files);
      }
    });
  });
}

async function findOutputFileName(){
  return new Promise(resolve => {
    glob(`build/wechatgame/assets/start-scene/index.*.js`, function(err, files){
      if(err){
        reject(err);
      }else if(files.length !== 1){
        reject(new Error("output path not found"))
      }else{
        resolve(files[0])
      }
    })
  })
}

function cocosUUIDPlugin() {
  return {
    name: "cocos-uuid-plugin",
    resolveId(source) {
      return null;
    },
    async transform(code, id) {
      if(id.endsWith(".ts")&& !id.endsWith("cchelper.ts") && /ccclass/g.test(code)) {
        const uuid = await loadUUID(id)
        const result = [
          `import {cclegacy} from "cc"`,
          `cclegacy._RF.push({}, "${uuid}", "${/.*\/([^/]*)\.ts/.exec(id)[1]}", void 0);`,
          code,
          `cclegacy._RF.pop();`
        ].join("\n")
        return result;
      }
      return null;
    },
  };
}


async function loadUUID(codePath){
  const metaSrc = await fs.readFile(codePath + ".meta", "utf-8");
  const mate = JSON.parse(metaSrc);
  return c.compressUuid(mate.uuid, false);
}

const t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
const r = new Array(128);
for (let i = 0; i < 128; ++i) r[i] = 0;
for (let i = 0; i < 64; ++i) r[t.charCodeAt(i)] = i;

const n = /-/g,
  s = /^[0-9a-fA-F-]{36}$/,
  o = /^[0-9a-fA-F]{32}$/;
const c = {
  compressUuid: function (e, t) {
    if (s.test(e)) e = e.replace(n, "");
    else if (!o.test(e)) return e;
    const r = !0 === t ? 2 : 5;
    return c.compressHex(e, r);
  },
  compressHex: function (e, r) {
    const n = e.length;
    let i = void 0 !== r ? r : n % 3;
    const o = []
    let s = e.slice(0, i);
    for (; i < n; ) {
      const u = parseInt(e[i], 16),
        a = parseInt(e[i + 1], 16),
        c = parseInt(e[i + 2], 16);
      o.push(t[(u << 2) | (a >> 2)]), o.push(t[((3 & a) << 4) | c]), (i += 3);
    }
    return s + o.join("");
  },
  decompressUuid: function (e) {
    if (23 === e.length) {
      const t = [];
      for (let i = 5; i < 23; i += 2) {
        const n = r[e.charCodeAt(i)],
          s = r[e.charCodeAt(i + 1)];
        t.push((n >> 2).toString(16)),
        t.push((((3 & n) << 2) | (s >> 4)).toString(16)),
        t.push((15 & s).toString(16));
      }
      e = e.slice(0, 5) + t.join("");
    } else {
      if (22 !== e.length) return e;
      {
        const t = [];
        for (let i = 2; i < 22; i += 2) {
          const n = r[e.charCodeAt(i)],
            s = r[e.charCodeAt(i + 1)];
          t.push((n >> 2).toString(16)),
          t.push((((3 & n) << 2) | (s >> 4)).toString(16)),
          t.push((15 & s).toString(16));
        }
        e = e.slice(0, 2) + t.join("");
      }
    }
    return [e.slice(0, 8), e.slice(8, 12), e.slice(12, 16), e.slice(16, 20), e.slice(20)].join("-");
  },
};

1赞

十分感谢兄弟,不过我是2.x :rofl:

output.format在2.2以下改成iife,2.3~2.4是啥忘了,好像还是systemjs,或者是commonjs,你自己看一下cocos打包的结果吧,跟cocos自身用一样的模块标准就行

了解,感谢感谢 :heart: