0

我有一组相互依赖的 Node.js 模块,我一直将它们构建为 ES6 模块,理想情况下,我希望能够将单个模块指定为入口点,并将这些(使用 grunt)构建到一个可以节点应用程序需要。

grunt-babel 似乎无法处理这种包装。

我知道 browserify 可以为浏览器执行此操作,并且我知道 browserify 可以包含 Node 模块,但我无法弄清楚如何让 browserify 将单个模块入口点转换为需要的 Node 模块。

因此,如果我的源文件(和入口点)src/hello.js是:

import world from './world.js';
export default function () {console.log('Hello' + world + '!');};

并且src/world.js是:

export default 'world';

我希望它能够从普通的 Node 应用程序中使用它,例如:

var hw = require('./dest/hello-world.js');
hw();

我的 grunt 文件需要是什么样的?

4

1 回答 1

0

原来我有两个问题:

在我的.babelrc文件中,我需要:

{
  "presets": ["es2015"],
  "plugins": ["add-module-exports"]
}

...而在我的 Grunt 文件中,我需要:

    browserify: {
        myNode: {
            options: {
                transform: [['babelify', {sourceMaps: true}]],
                browserifyOptions: {
                    standalone: 'dummyPlaceholder'
                }
                // Depending on your needs, you may also
                //  need `node: true` here or the options
                // in the 2nd argument of the `browserify` call
                // (as I required to allow GLOBAL.window = GLOBAL
                //  injection)
                // at https://github.com/substack/node-browserify/issues/1277#issuecomment-115198436
            },
            files: {
                'dist/<%= pkg.name%>-node.js': 'src/node.js'
            }
        }
    },

插件“add-module-exports”对于避免 Babel 中的更改是必要的,这需要调用 likevar mod = require('mod').default;而不是 just var mod = require('mod');

standalone属性实际上并未在此处用于创建全局,因为它正在模块环境(Node/CommonJS)中使用,但需要该属性的存在才能触发导出。

于 2016-06-01T21:14:42.127 回答