2016-02-12 8 views
3

У меня есть приложение-узел, в котором используется рендер-ретранслятор для рендеринга React views на стороне сервера. Моя проблема в том, что я использую require.ensure для разделения кода на стороне клиента, но не хочу, чтобы было разделение кода при компиляции кода на стороне сервера. Вот мой WebPack конфигурации:Webpack игнорировать разделение кода, когда целевой узел

{ 
    entry: path.join(__dirname, '../server/app.js'), 
    target: 'node', 
    output: { 
    path: './', 
    filename: 'server.js' 
    }, 
    module: { 
    loaders: [ 
     { test: /\.js$/, loader: 'babel', exclude: /node_modules/ }, 
     { test: /\.hbs$/, loader: 'handlebars-loader', include: /client/ } 
    ] 
    }, 
    externals: nodeModules 
} 

Когда я запускаю его, я получаю server.js, 1.server.js, 2.server.js и т.д. Я бы просто иметь один файл server.js ,

В верхней части каждого файла маршрута у меня есть:

if (typeof require.ensure !== 'function') require.ensure = (d, c) => c(require); 

Который работает, когда я использую require('babel/register') в разработке, но я предпочел бы иметь скомпилированный файл для производства.

ответ

6

Я обращался к этому с условностями вокруг требования. Если это сборка браузера, require.ensure, если это сборка сервера, просто требуется. Я использую DefinePlugin определить «постоянные» переменные среды для каждой сборки, так что это будет выглядеть как

if (BUILD_BROWSER) { 
    require.ensure('foo.js', function() { ... }); 
} else { 
    require('foo.js'); 
    ... 
} 

статический анализ WebPack является только достаточно умен, чтобы понять, логические значения, так что делать что-то вроде if (BUILD_TARGET === 'browser') не будет Работа; синтаксический анализатор не будет следовать логике и будет обрабатывать оба требования.

Если вы используете плагин Uglify, который вычеркнет ненужную условную логику, чтобы вы не раздували вашу производственную сборку.

+0

Спасибо! Работал как шарм. – Brad

+0

, но тогда у вас возникла проблема с React, где контрольные суммы не совпадают между HTML-версией на стороне сервера и HTML-кодом, созданным на клиенте, тем самым теряя многие «преимущества» рендеринга на стороне сервера. То есть сервер и клиент выполняют визуализацию разных HTML. Кроме того, я даже не уверен, как на клиенте условно загружать из другого js-пакета, встроенного в DOM (который вы только визуализируете для данного маршрута), не запуская теперь ваш основной пакет, чтобы включить те же файлы. Кажется, он мог работать только путем создания точек входа для каждого маршрута, а не 'обеспечения'. –

Смежные вопросы