在项目中使用了import,预览运行一切顺利,但到真机就报错,因为有些只读变量被修改,因此猜测是因为import被转译自动加上了严格模式。百度一番发现可以npm安装babel-plugin-transform-remove-strict-mode来解决,但是这个到底该装在哪呢?求论坛大佬们指教
写个插件,把构建出来的js文件的“use strict”字符串删除掉
这方法感觉有点粗暴~
没人知道吗?如果只能删掉"use strict",那构建出来的js文件在哪里啊?求指教
我选择直接换掉整个脚本打包流程 
打包流程为先用cocos正常打包来生成资源,然后用下面的rollup配置编译整个项目脚本
没有你要的去掉 use strict,自己找下插件吧 
以下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 
output.format在2.2以下改成iife,2.3~2.4是啥忘了,好像还是systemjs,或者是commonjs,你自己看一下cocos打包的结果吧,跟cocos自身用一样的模块标准就行
了解,感谢感谢 
