как разделить код javascript между интерфейсом и сервером (ES6) - PullRequest
2 голосов
/ 14 января 2020

Это ES6-специфицированный c дубликат этого потока SO , в котором подробно описано, как создать javascript модуль, который можно экспортировать для использования как в контексте браузера, так и в контексте узла.

Я был бы так же рад получить ответ там, если это более уместно.

Для справки приведу цитату из решения ES5, а также проблемы, возникающие при попытке перевести его на ES6. (Кредит для пользователей @caolan и @broesch.)

(function(exports){

    // Your code goes here. For example: 
   exports.test = function(){
        return 'hello world'
    };

})(typeof exports === 'undefined'? this.mymodule = {} : exports);

Таким образом, если exports не определено, вы должны быть в браузере, в этом случае mymodule объявляется в window ( т.е. this). Или, если определено exports, это в контексте node, и в этом случае вы можете просто var mymodule = require('mymodule'). И в любой среде вы можете использовать его как mymodule.test(). Отлично.

Одна из проблем заключается в том, что exports.whatever не отображает whatever в текущей области, поэтому, если вы хотите использовать whatever в модуле, вам в конечном итоге потребуется

var whatever = 3;
exports.whatever = whatever;

, который может стать громоздким и легко забываемым.

В ES6, с другой стороны, вы можете сделать export const whatever = 3, который будет и экспортировать, и выставлять whatever, который является СУХИМЫМ и, следовательно, более простым в обслуживании.

Новые проблемы заключаются в том, что

  1. export должен находиться на верхнем уровне файла, что означает, что вы не можете использовать синтаксис из ответа ES5
  2. export не является функцией (не так ли?), Поэтому вы не можете использовать type of для получения условного контекста браузера / узла.

Итак, мой вопрос: какова версия ES6 для создания файла .js, который можно экспортировать как в браузер, так и в узел?

...