2014-07-03 5 views
15

मेरे webpack प्रवेश बिंदु नाम पर एक [hash] में शामिल हैं:एप्लिकेशन एचटीएमएल में वेबपैक एंट्री पॉइंट्स का सीधा लिंक शामिल करें?

entry: "index.js", 
output: { 
    path: "build/", 
    filename: "index-[hash].js", 
} 

मैं अपने आवेदन के एचटीएमएल से कि प्रवेश बिंदु से सीधे लिंक कर सकते हैं?

<script src="build/index-41d40fe7b20ba1dce81f.js"></script> 

मैं यह कैसे कर सकते हैं:

उदाहरण के लिए, मैं HTML है कि ग्राहक को भेजी जाने वाली शामिल करना चाहते हैं? क्या कोई प्लगइन है जो एक एंट्री पॉइंट मैनिफेस्ट उत्पन्न कर सकता है जो मेरा एप्लिकेशन उचित फ़ाइल नामों को पढ़ और निकाल सकता है?

उत्तर

25

html-webpack-plugin (मैं लेखक हूँ) एक उत्पन्न करेगा: संदर्भ का एक सा के लिए भी

var util = require('util'); 
var path = require('path'); 
var gulp = require('gulp'); 
var runSequence = require('run-sequence'); 
var rimraf = require('rimraf'); 
var gzip = require('gulp-gzip'); 
var notify = require('gulp-notify'); 
var gutil = require('gulp-util'); 
var webpack = require('webpack'); 
var webpackConfig = require('./client/webpack.config'); 
var through2 = require('through2'); 

gulp.task("webpack", function (cb) { 
    webpack(webpackConfig, function (err, stats) { 
     if (err) throw new gutil.PluginError("webpack", err); 

     var jsFilename = stats.toJson().assetsByChunkName['app']; 
     console.log('>>>>', jsFilename); 
     // if source-maps are turned on, you'll get [ 'somefile.js', 'somefile.js.map' ] 
     if (util.isArray(jsFilename)) { 
      jsFilename = jsFilename.filter(function (filename) { 
       return path.extname(filename).toLowerCase() === '.js' 
      }).shift(); 
     } 

     // write the hashed main.js to /dist/index.html 
     gulp.src('./client/index.html') 
      .on('error', handleErrors) 
      .pipe(through2.obj(function (vinylFile, enc, tCb) { 
       vinylFile.contents = new Buffer(String(vinylFile.contents) 
        .replace('main.js', jsFilename)); 
       this.push(vinylFile); 
       tCb(); 
      })) 
      .pipe(gulp.dest('./dist/')); 

     cb(); 
    }); 
}); 

function handleErrors() { 
    var args = Array.prototype.slice.call(arguments); 
    notify.onError({ title: 'Error', message: '<%= error.message %>'}).apply(this, args); 
    this.emit('end'); 
} 

gulp.task('gzip-deploy', function() { 
    return gulp.src('./dist/**/*') 
     .on('error', handleErrors) 
     .pipe(gzip()) 
     .pipe(gulp.dest('./dist/')); 
}); 

gulp.task('clean', function (cb) { 
    return rimraf('./dist', cb); 
}); 

gulp.task('default', function (cb) { 
    runSequence('clean', 'webpack', cb); 
}); 

gulp.task('deploy', function (cb) { 
    webpackConfig.plugins = webpackConfig.plugins = [ 
     new webpack.optimize.UglifyJsPlugin(), 
     new webpack.DefinePlugin({ 
      "process.env": { 
       NODE_ENV: JSON.stringify("production") 
      } 
     }) 
    ]; 
    webpackConfig.watch = false; 
    webpackConfig.devtool = null; 
    webpackConfig.output.filename = "main-[hash].js"; 

    runSequence('clean', 'webpack', 'gzip-deploy', cb); 
}); 

यहाँ मेरी webpack.config.js फ़ाइल है: यहाँ एक gulpfile स्निपेट होता है, साथ ही साथ एक सा मदद कर सकता है है index.html सही हैश बंडल फ़ाइल नाम का संदर्भ देने के लिए।

var HtmlWebpackPlugin = require("html-webpack-plugin"); 
var webpackConfig = { 
    entry: "index.js", 
    output: { 
     path: "build/", 
     filename: "index-[hash].js", 
    }, 
    plugins: [new HtmlWebpackPlugin()] 
} 

यह build/index.html कि एक <script> टैग के साथ अपने बंडल में शामिल हैं का उत्पादन करेगा।

+1

बहुत बढ़िया प्लग-इन मैन। – Max

+0

अरे, वास्तव में, भयानक प्लगइन। क्या कोई नया ".html" फ़ाइल बनाने के बिना और "ब्लूंप टेम्पलेट" का उपयोग किए बिना इसका उपयोग करने का कोई विकल्प है? मेरे पास एक मौजूदा HTML फ़ाइल है जिसे मैं –

+1

अपडेट करना चाहता हूं, मुझे यकीन नहीं है कि यह अप्रैल में एक विकल्प था जब आपने पिछली बार टिप्पणी की थी, लेकिन ऐसा लगता है कि 6 महीने बाद, विकल्प 'टेम्पलेट' हैं (एक मौजूदा टेम्पलेट प्राप्त करता है फ़ाइल नाम) और 'टेम्पलेट सामग्री' (सीधे HTML की एक स्ट्रिंग जोड़ें)। मैं, वैसे, भयानक प्लगइन से सहमत हूं। – trysis

8

मैंने अभी वेबपैक के साथ खेलना शुरू कर दिया है, और पाया है कि gulp नई हैश जेएस फाइलों को index.html पर लिखने के लिए एक अच्छा फिट है। यदि आप गल्प का उपयोग नहीं करना चाहते हैं, तो this discussion regarding doing something similar with a plugin थोड़ा सा मदद कर सकता है।

var path = require('path'); 

module.exports = { 
    context: __dirname, 
    devtool: 'source-map', 
    entry: { 
     app: './main.js' 
    }, 
    watch: true, 
    output: { 
     path: path.join(__dirname, "/../dist"), 
     filename: "main.js" 
    }, 
    module: { 
     loaders: [ 
      { test: /\.js$/, loader: 'jsx-loader?harmony' }, 
      { test: /\.css$/, loader: "style-loader!css-loader" }, 
      { test: /\.less$/, loader: "style-loader!css-loader!less-loader" }, 
      { test: /\.png$/, loader: "url-loader?prefix=img/&limit=8192" }, 
      { test: /\.jpg$/, loader: "url-loader?prefix=img/&limit=8192" }, 
      { test: /\.gif$/, loader: "url-loader?prefix=img/&limit=8192" }, 
      { test: /\.woff$/, loader: "url-loader?prefix=font/&limit=8192" }, 
      { test: /\.eot$/, loader: "file-loader?prefix=font/" }, 
      { test: /\.ttf$/, loader: "file-loader?prefix=font/" }, 
      { test: /\.svg$/, loader: "file-loader?prefix=font/" } 
     ] 
    }, 
    resolve: { 
     extensions: ['', '.js', '.json'], 
     modulesDirectories: ['node_modules'] 
    }, 
    plugins: [] 
}; 
+3

एक 'stats.toJson()। संपत्ति ByChunkName' भी है जो एक ऑब्जेक्ट है जो' chunkName' को फ़ाइल नामों में चिह्नित करता है। –

+0

धन्यवाद! यह काफी हद तक गल्प कार्य को सरल बनाता है ('stats.toJson()। Assets.reduce' गंदे महसूस किया)। कोड आपके सुझाव के अनुसार संपादित किया गया। – Max

संबंधित मुद्दे