2016-08-20 30 views
5

Bu sorunun daha önce sorulmuş olduğunu biliyorum, ancak cevabı hiçbir yerde bulamıyorum - sanki yapmam gereken herşeyi yapıyormuş gibi görünüyorum. Bu yüzden, HMR + React ve tipcript (tsx sözdizimi ile) işlemesi gereken bu webpack.config.js dosyasına sahibim, ancak bu paket oluşturmuyor. Derleme konusunda hiçbir hata atar ve her şey yolunda gibi görünüyor, ancak paketi almaya çalıştığımda 404 döndürür. İşte benim dosya yapısı:bundle.js'yi bulamıyor

someApp/ 
    src/ 
    index.tsx 
    components/ 
     Hello.tsx 
    dist/ 
    webpack.config.js 
    ... 

Ve işte benim webpack yapılandırma var:

var path = require('path') 
var webpack = require('webpack') 

module.exports = { 
    entry: [ 
     'webpack-dev-server/client?http://localhost:3000', 
     'webpack/hot/only-dev-server', 
     './src/index.tsx' 
    ], 
    output: { 
     path: path.join(__dirname, '/dist'), 
     filename: 'bundle.js', 
     publicPath: '/public/' 
    }, 

    plugins: [ 
     new webpack.HotModuleReplacementPlugin() 
    ], 

    devtool: 'eval', 

    resolve: { 
     extensions: ['', '.webpack.js', '.web.js', '.ts', '.tsx', '.js'] 
    }, 

    module: { 
     loaders: [ 
      { 
       test: /\.tsx?$/, 
       loaders: [ 
      'react-hot-loader', 
      'ts-loader' 
     ], 
     include: path.join(__dirname, '/src') 
      } 
     ], 

     preLoaders: [ 
      { test: /\.js$/, loader: 'source-map-loader' } 
     ] 
    }, 
    externals: { 
     'react': 'React', 
     'react-dom': 'ReactDOM' 
    }, 
}; 

başka tuhaf bir şey ben sadece webpack çalıştırdığınızda beri düğüm aracılığıyla bu yürütülmesi ile ilgili bir şey olabileceğini düşünüyorum olmasıdır tek başına paketi derler. İşte benim kod sunucusunu başlatmak için var: Belki bir şey eksik ama WebPack için oldukça yeni

var webpack = require('webpack'); 
var WebpackDevServer = require('webpack-dev-server'); 
var config = require('./webpack.config'); 

new WebpackDevServer(webpack(config), { 
    publicPath: config.output.publicPath, 
    hot: true, 
    historyApiFallback: true 
}).listen(3000, 'localhost', function (err, result) { 
    if (err) { 
    return console.log(err) 
    } 

    console.log('Listening at http://localhost:3000/') 

}) 

böylece herhangi bir yardım şaşırtıcı olurdu!

cevap

10

Thats webpack-dev-sunucu belleğinden bundle.js hizmet çünkü. Bu, bundle.js hizmetini hızlı bir şekilde sunmak için yapılır. Sen diske

module.exports = { 
    entry: './src/index.tsx', 
    output: { 
     path: path.join(__dirname, 'dist'), 
     filename: 'bundle.js', 
     publicPath: '/public/' 
    }, 
. 
. 
. 

ve diğer tüm modülleri için bundle.js tükürür üretimi için başka webpack yapılandırması Eğer bundle.js getirmek istiyorsanız, sadece dev-sunucu

yer vermediğinizden ekleyebilir localhost gibi: 3000 //..../ bundle.js

bu

var path = require('path') 
var webpack = require('webpack') 

module.exports = { 
    entry:'./src/index.tsx', 
    output: { 
     path: path.join(__dirname, 'dist'), 
     filename: 'bundle.js', 
     publicPath: '/public/' 
    }, 

    //plugins: [ 
     // new webpack.HotModuleReplacementPlugin() 
    //], 

    devtool: 'eval', 

    resolve: { 
     extensions: ['', '.webpack.js', '.web.js', '.ts', '.tsx', '.js'] 
    }, 

    module: { 
     loaders: [ 
      { 
       test: /\.tsx?$/, 
       loaders: [ 
      'react-hot-loader', 
      'ts-loader' 
     ], 
     include: path.join(__dirname, 'src') 
      } 
     ], 

     preLoaders: [ 
      { test: /\.js$/, loader: 'source-map-loader' } 
     ] 
    }, 
    externals: { 
     'react': 'React', 
     'react-dom': 'ReactDOM' 
    }, 
}; 

EDIT deneyin: Eğer

01 bundle.js getirmek istiyorsanız

publicPath: '/ public /' ile tanımlananları kullanmak zorundasınız. bu yüzden sizin için bundle.js'yi getirebileceğiniz URL bu localhost'dur: 3000/public/bundle.js

+0

Teşekkürler David! Bu, diskten sunması için delice harika olsa da, paket dosyası 'localhost: 3000/dist/bundle.js'. Bu, yapılandırma dosyasımdaki durumun böyle olmasının bir sebebi var mı?Belki de sadece – Jay

+0

dan bir paket istemediğin yolun ne olduğu konusunda kafam karıştı, fakat yanlış bir şey yapmıyorsun ama webpack-dev-server bundle.js'yi hafızadan sunuyor, bende bunu değiştirmek için bir seçenek yok. "webpack-dev-server/client? http: // localhost: 3000 '," "webpack/hot/only- eklemezseniz diske tüküren başka bir webpack.config.js dosyası eklemektir dev-server ', diske çıktı olacaktır – David

+0

David'i açıkladığınız için teşekkürler! Sanırım beni yanlış anladınız, evet, dev sunucusunun bundle.js'yi bellekten hizmet ettiğini anlıyorum, 'localhost: 3000/dist/bundle.js' istemini yapamıyorum ve almamalı mıyım? Diske yazılmayacağından 'dist' klasöründe olmayacağımı anlıyorum, ama bunu talep edebilmem lazım, değil mi? – Jay

4

Bunu için çıkışını değiştirmek gerekir düşünüyorum:

output: { 
    path: path.join(__dirname, '/dist'), // <- change last argument 
    filename: 'bundle.js', 
    publicPath: '/public/' 
}, 
+0

Sen bir canavarsın, teşekkürler dostum! Bu mükemmeldi, her zaman yolu unuturdum.join '/' önekine sahip olmak zorundadır. – Jay

+0

Rica ederim. – alexi2

+0

Ahh yardım etmekten mutlu olmak için üzgünüm, üzgünüm, dist klasörümde eski bir paket olduğunu düşünüyorum. Sanırım haklısın bu da bir problemdi, ama ne yazık ki "localhost: 3000/dist/bundle.js" – Jay