Skip to content

How about separate emitted code to independent modules? #12574

Closed
@acrazing

Description

@acrazing

Currently, compile es6/7 code to es5/3 will emit generated code to local file. For example, if we write a file as follow:

function p(): Promise<number> {
  return new Promise<number>((resolve) => {
    setTimeout(() => resolve(1), 1e3)
  })
}

async function next() {
  const value = await p()
  console.log('next value %s', value)
  const next = await p()
  return next
}

const ret = next()

console.log('return: %s', ret)

ret.then((value) => console.log('promise returned value: %s', value))

Set the target to es5, the compile result as follow:

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments)).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t;
    return { next: verb(0), "throw": verb(1), "return": verb(2) };
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [0, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
function p() {
    return new Promise(function (resolve) {
        setTimeout(function () { return resolve(1); }, 1e3);
    });
}
function next() {
    return __awaiter(this, void 0, void 0, function () {
        var value, next;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0: return [4 /*yield*/, p()];
                case 1:
                    value = _a.sent();
                    console.log('next value %s', value);
                    return [4 /*yield*/, p()];
                case 2:
                    next = _a.sent();
                    return [2 /*return*/, next];
            }
        });
    });
}
var ret = next();
console.log('return: %s', ret);
ret.then(function (value) { return console.log('promise returned value: %s', value); });

The generated file is so large! If we use async/await in each project file, will emit a mass of useless code.

How about separate the emited functions to a separated module, and use require to load it?

For example:

var __awaiter = require('typescript/libs/awaiter');
var __generator = require('typescript/libs/generator');

function p() {
    return new Promise(function (resolve) {
        setTimeout(function () { return resolve(1); }, 1e3);
    });
}
function next() {
    return __awaiter(this, void 0, void 0, function () {
        var value, next;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0: return [4 /*yield*/, p()];
                case 1:
                    value = _a.sent();
                    console.log('next value %s', value);
                    return [4 /*yield*/, p()];
                case 2:
                    next = _a.sent();
                    return [2 /*return*/, next];
            }
        });
    });
}
var ret = next();
console.log('return: %s', ret);
ret.then(function (value) { return console.log('promise returned value: %s', value); });

Metadata

Metadata

Assignees

No one assigned

    Labels

    QuestionAn issue which isn't directly actionable in code

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions