Skip to content

Commit d0a5e60

Browse files
committed
build: create minified browser script in prod release working
1 parent 49c4dbe commit d0a5e60

File tree

3 files changed

+77
-22
lines changed

3 files changed

+77
-22
lines changed

docs/API-Reference/utils/ExtensionLoader.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ Load extensions.
156156
## uninstallExtension(extensionID) ⇒ <code>Promise</code>
157157
Uninstall a deprecated extension
158158

159-
**Kind**: global function
160-
**Returns**: <code>Promise</code> - A promise that resolves when the extension is uninstalled successfully
159+
**Kind**: global function
160+
**Returns**: <code>Promise</code> - A promise that resolves when the extension is uninstalled successfully
161161

162162
| Param | Type | Description |
163163
| --- | --- | --- |

gulpfile.js/index.js

Lines changed: 74 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ const glob = require("glob");
3535
const crypto = require("crypto");
3636
const rename = require("gulp-rename");
3737
const execSync = require('child_process').execSync;
38+
const terser = require('terser');
3839

3940
function cleanDist() {
4041
return del(['dist', 'dist-test']);
@@ -104,7 +105,6 @@ function _deletePhoenixProSourceFolder() {
104105
for (const folder of phoenixProFolders) {
105106
if (fs.existsSync(folder)) {
106107
fs.rmSync(folder, { recursive: true, force: true });
107-
console.log(`Deleted phoenix-pro source folder: ${folder}`);
108108
}
109109
}
110110
resolve();
@@ -581,24 +581,69 @@ function containsRegExpExcludingEmpty(str) {
581581
}
582582

583583

584+
// Paths that should be minified during production builds
585+
const minifyablePaths = [
586+
'src/extensionsIntegrated/phoenix-pro/browser-context'
587+
];
588+
589+
function _minifyBrowserContextFile(fileContent) {
590+
const minified = terser.minify(fileContent, {
591+
mangle: false,
592+
compress: {
593+
unused: false
594+
},
595+
output: {
596+
comments: function(node, comment) {
597+
const text = comment.value.trim();
598+
return text.includes("DONT_STRIP_MINIFY:");
599+
}
600+
}
601+
});
602+
603+
if (minified.error) {
604+
throw new Error(`Failed to minify file: ${minified.error}`);
605+
}
606+
607+
return minified.code;
608+
}
609+
610+
function _isMinifyablePath(filePath) {
611+
const normalizedFilePath = path.normalize(filePath);
612+
return minifyablePaths.some(minifyPath =>
613+
normalizedFilePath.startsWith(path.normalize(minifyPath))
614+
);
615+
}
616+
617+
function getKey(filePath, isDevBuild) {
618+
return isDevBuild + filePath;
619+
}
620+
584621
const textContentMap = {};
585622
const excludeSuffixPathsInlining = ["MessageIds.json"];
586-
function inlineTextRequire(file, content, srcDir) {
623+
function inlineTextRequire(file, content, srcDir, isDevBuild = true) {
587624
if(content.includes(`'text!`) || content.includes("`text!")) {
588625
throw new Error(`in file ${file} require("text!...") should always use a double quote "text! instead of " or \``);
589626
}
590627
if(content.includes(`"text!`)) {
591628
const requireFragments = extractRequireTextFragments(content);
592629
for (const {requirePath, requireStatement} of requireFragments) {
593-
let textContent = textContentMap[requirePath];
594630
let filePath = srcDir + requirePath;
595631
if(requirePath.startsWith("./")) {
596632
filePath = path.join(path.dirname(file), requirePath);
597633
}
634+
let textContent = textContentMap[getKey(filePath, isDevBuild)];
635+
598636
if(!textContent){
599637
console.log("reading file at path: ", filePath);
600-
const fileContent = fs.readFileSync(filePath, "utf8");
601-
textContentMap[requirePath] = fileContent;
638+
let fileContent = fs.readFileSync(filePath, "utf8");
639+
640+
// Minify inline if this is a minifyable path and we're in production mode
641+
if (!isDevBuild && _isMinifyablePath(filePath)) {
642+
console.log("Minifying file inline:", filePath);
643+
fileContent = _minifyBrowserContextFile(fileContent);
644+
}
645+
646+
textContentMap[getKey(filePath, isDevBuild)] = fileContent;
602647
textContent = fileContent;
603648
}
604649
if((requirePath.endsWith(".js") && !requirePath.includes("./")) // js files that are relative paths are ok
@@ -626,7 +671,7 @@ function inlineTextRequire(file, content, srcDir) {
626671
return content;
627672
}
628673

629-
function makeBracketsConcatJS() {
674+
function _makeBracketsConcatJSInternal(isDevBuild = true) {
630675
return new Promise((resolve)=>{
631676
const srcDir = "src/";
632677
const DO_NOT_CONCATENATE = [
@@ -660,7 +705,7 @@ function makeBracketsConcatJS() {
660705
console.log("Merging: ", requirePath);
661706
mergeCount ++;
662707
content = content.replace("define(", `define("${requirePath}", `);
663-
content = inlineTextRequire(file, content, srcDir);
708+
content = inlineTextRequire(file, content, srcDir, isDevBuild);
664709
concatenatedFile = concatenatedFile + "\n" + content;
665710
}
666711
}
@@ -671,6 +716,14 @@ function makeBracketsConcatJS() {
671716
});
672717
}
673718

719+
function makeBracketsConcatJS() {
720+
return _makeBracketsConcatJSInternal(true);
721+
}
722+
723+
function makeBracketsConcatJSWithMinifiedBrowserScripts() {
724+
return _makeBracketsConcatJSInternal(false);
725+
}
726+
674727
function _renameBracketsConcatAsBracketsJSInDist() {
675728
return new Promise((resolve)=>{
676729
fs.unlinkSync("dist/brackets.js");
@@ -759,8 +812,8 @@ function makeExtensionConcatJS(extensionName) {
759812
`define("${defineId}", `
760813
);
761814

762-
// inline text requires
763-
content = inlineTextRequire(file, content, extensionDir);
815+
// inline text requires (extensions use isDevBuild=true, they're minified via makeJSDist)
816+
content = inlineTextRequire(file, content, extensionDir, true);
764817

765818
concatenatedFile += '\n' + content;
766819
mergeCount++;
@@ -1005,25 +1058,27 @@ function _patchMinifiedCSSInDistIndex() {
10051058
const createDistTest = series(copyDistToDistTestFolder, copyTestToDistTestFolder, copyIndexToDistTestFolder);
10061059

10071060
exports.build = series(copyThirdPartyLibs.copyAll, makeLoggerConfig, generateProLoaderFiles, zipDefaultProjectFiles, zipSampleProjectFiles,
1008-
makeBracketsConcatJS, _compileLessSrc, _cleanReleaseBuildArtefactsInSrc, // these are here only as sanity check so as to catch release build minify fails not too late
1061+
makeBracketsConcatJS, makeBracketsConcatJSWithMinifiedBrowserScripts, _compileLessSrc, _cleanReleaseBuildArtefactsInSrc, // these are here only as sanity check so as to catch release build minify fails not too late
10091062
createSrcCacheManifest, validatePackageVersions);
10101063
exports.buildDebug = series(copyThirdPartyLibs.copyAllDebug, makeLoggerConfig, generateProLoaderFiles, zipDefaultProjectFiles,
1011-
makeBracketsConcatJS, _compileLessSrc, _cleanReleaseBuildArtefactsInSrc, // these are here only as sanity check so as to catch release build minify fails not too late
1064+
makeBracketsConcatJS, makeBracketsConcatJSWithMinifiedBrowserScripts, _compileLessSrc, _cleanReleaseBuildArtefactsInSrc, // these are here only as sanity check so as to catch release build minify fails not too late
10121065
zipSampleProjectFiles, createSrcCacheManifest);
10131066
exports.clean = series(cleanDist);
10141067
exports.reset = series(cleanAll);
10151068

10161069
exports.releaseDev = series(cleanDist, exports.buildDebug, makeBracketsConcatJS, makeConcatExtensions, _compileLessSrc,
10171070
makeDistAll, cleanUnwantedFilesInDist, releaseDev, _renameConcatExtensionsinDist,
10181071
createDistCacheManifest, createDistTest, _cleanPhoenixProGitFolder, _cleanReleaseBuildArtefactsInSrc);
1019-
exports.releaseStaging = series(cleanDist, exports.build, makeBracketsConcatJS, makeConcatExtensions, _compileLessSrc,
1020-
makeDistNonJS, makeJSDist, makeJSPrettierDist, makeNonMinifyDist, cleanUnwantedFilesInDist,
1021-
_renameBracketsConcatAsBracketsJSInDist, _renameConcatExtensionsinDist, _patchMinifiedCSSInDistIndex, releaseStaging,
1022-
createDistCacheManifest, createDistTest, _deletePhoenixProSourceFolder, _cleanReleaseBuildArtefactsInSrc);
1023-
exports.releaseProd = series(cleanDist, exports.build, makeBracketsConcatJS, makeConcatExtensions, _compileLessSrc,
1024-
makeDistNonJS, makeJSDist, makeJSPrettierDist, makeNonMinifyDist, cleanUnwantedFilesInDist,
1025-
_renameBracketsConcatAsBracketsJSInDist, _renameConcatExtensionsinDist, _patchMinifiedCSSInDistIndex, releaseProd,
1026-
createDistCacheManifest, createDistTest, _deletePhoenixProSourceFolder, _cleanReleaseBuildArtefactsInSrc);
1072+
exports.releaseStaging = series(cleanDist, exports.build, makeBracketsConcatJSWithMinifiedBrowserScripts,
1073+
makeConcatExtensions, _compileLessSrc, makeDistNonJS, makeJSDist, makeJSPrettierDist, makeNonMinifyDist,
1074+
cleanUnwantedFilesInDist, _renameBracketsConcatAsBracketsJSInDist, _renameConcatExtensionsinDist,
1075+
_patchMinifiedCSSInDistIndex, releaseStaging, createDistCacheManifest, createDistTest,
1076+
_deletePhoenixProSourceFolder, _cleanReleaseBuildArtefactsInSrc);
1077+
exports.releaseProd = series(cleanDist, exports.build, makeBracketsConcatJSWithMinifiedBrowserScripts,
1078+
makeConcatExtensions, _compileLessSrc, makeDistNonJS, makeJSDist, makeJSPrettierDist, makeNonMinifyDist,
1079+
cleanUnwantedFilesInDist, _renameBracketsConcatAsBracketsJSInDist, _renameConcatExtensionsinDist,
1080+
_patchMinifiedCSSInDistIndex, releaseProd, createDistCacheManifest, createDistTest,
1081+
_deletePhoenixProSourceFolder, _cleanReleaseBuildArtefactsInSrc);
10271082
exports.releaseWebCache = series(makeDistWebCache);
10281083
exports.serve = series(exports.build, serve);
10291084
exports.zipTestFiles = series(zipTestFiles);

src/LiveDevelopment/BrowserScripts/RemoteFunctions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// this is a single non-minified file sent to browser preview. keep this light. add features as extensions
1+
// this is a single file sent to browser preview. keep this light. add features as extensions
22
/**
33
* RemoteFunctions define the functions to be executed in the browser. This
44
* modules should define a single function that returns an object of all

0 commit comments

Comments
 (0)