问答详情
源自:3-3 自动化生成项目中的html页面(下)

Cannot read property 'entry' of undefined

var htmlWebpackPlugin = require('html-webpack-plugin');
//commom.js的模块化输出
module.exports={
	entry:{
		main:'./src/script/main.js',		
		a: './src/script/a.js',
		b: './src/script/b.js',
		c: './src/script/c.js'
	},//入口文件
	output:{
		path:'./dist',
		filename:'js/[name]-[chunkhash].js',
		// publicPath:"http://cdn.com/"
	},
	plugins:[
		new htmlWebpackPlugin({
			filename:'a.html',
			template:'index.html',
			title:"webapck is a",
			inject:'body',
			chunks:['main','a']
		 }),
		new htmlWebpackPlugin({
			filename:'b.html',
			template:'index.html',
			title:"webapck is b",
			inject:'body',
			chunks:['b']
		}),
		new htmlWebpackPlugin({
			filename:'c.html',
			template:'index.html',
			title:"webapck is c",
			inject:'body',
			chunks:['c']
		})
	]
};

除了a页面可以生成,b.html和c.html都有错误

Html Webpack Plugin:
<pre>
  TypeError: Cannot read property 'entry' of undefined
  
  - index.html:17237 
    D:/dwf/study/webpacklearn/index.html:17237:42
  
  - index.html:17240 module.exports
    D:/dwf/study/webpacklearn/index.html:17240:3
  
  - index.js:265 
    [webpacklearn]/[html-webpack-plugin]/index.js:265:16
  
  - util.js:16 tryCatcher
    [webpacklearn]/[bluebird]/js/release/util.js:16:23
  
  - promise.js:512 Promise._settlePromiseFromHandler
    [webpacklearn]/[bluebird]/js/release/promise.js:512:31
  
  - promise.js:569 Promise._settlePromise
    [webpacklearn]/[bluebird]/js/release/promise.js:569:18
  
  - promise.js:606 Promise._settlePromiseCtx
    [webpacklearn]/[bluebird]/js/release/promise.js:606:10
  
  - async.js:138 Async._drainQueue
    [webpacklearn]/[bluebird]/js/release/async.js:138:12
  
  - async.js:143 Async._drainQueues
    [webpacklearn]/[bluebird]/js/release/async.js:143:10
  
  - async.js:17 Immediate.Async.drainQueues
    [webpacklearn]/[bluebird]/js/release/async.js:17:14
  
</pre>


提问者:桃花开了 2017-03-15 11:22

个回答

  • 慕村6039329
    2017-03-15 14:03:11
    已采纳

    是不是你的 index.html 文件里用 script 引用了 js?如果是,注释或删除后重新运行应该就好了~

  • 回路
    2018-05-10 17:42:50

    必须删掉模板中script标签引入,注释都不好使

  • 闷骚程序源
    2017-12-20 14:52:41

    webpack模板中的注释也被视为模块,他需要保证注释的准确性,所以,如果在注释中引入的chunks中没有响应的内容,就会报错。

    我的a.html是ok的,但是b,c都是不行,就是如此。

  • 请叫我阿白白
    2017-09-21 14:10:18

    有可能是你配置文件里写了excludeChunks['main'],而你在html中写的是 compilation.assets[htmlWebpackPlugin.files.chunks.main.entry.substr(htmlWebpackPlugin.files.publicPath.length)].source()  这样也会报错,与excludeChunks 冲突 

  • 慕无忌8595264
    2017-08-31 20:30:39

    确实 注释了script之后运行不成功 删掉script才可以 

  • 坚强的波波
    2017-08-11 11:11:41

    chunks:['main','b']   必须引入main,我是因为b和c都没引入才报错的

  • _wsx
    2017-08-05 08:41:32

    你需要在b和c里也chunks:['b','main'] chunks:['c','main']

  • 一脚一个榴莲
    2017-07-31 14:52:35

    老师用的是excludeChunks,我用的是chunks,报错后的解决方法:在webpack.config.js中chunks:["b","main"]和chunks:["c","main"]都加上“main”就好了。得出的结论,模板html文件中如果有固定引入某个打包后的js文件,那么相应的调用模板文件的配置中就要在chunks中加入固定的js文件在entry中对应的key。如:

    <%=
          /*这里就引入了固定的main对应的打包后的js文件*/ compilation.assets[htmlWebpackPlugin.files.chunks.main.entry.substr(htmlWebpackPlugin.files.publicPath.length)].source()
       %>

    那么webpack.config.js中chunks:["b","main"],就要写"main",不然就报错误:

    Cannot read property 'entry' of undefined


  • 翟良
    2017-07-30 16:32:47

    也有同样的疑问

  • 小晚啦啦啦
    2017-07-15 10:26:19

    好吧,虽然删除template中的script确实可以解决问题,但是如果确实需要在template中插入script标签呢,到底怎么破?望有人能解答一下这个问题

  • MorningDuGe
    2017-06-05 15:46:21

    <script type="text/javascript">
       <%=
           compilation.assets[htmlWebpackPlugin.files.chunks.main.entry.substr(htmlWebpackPlugin.files.publicPath.length)].source()
       %>
    </script>

    在head中插入这段代码也不会生成b.html和c.html怎么办

  • Sear
    2017-05-12 16:17:46

    确实需要删除才可以

  • ao_nono
    2017-03-25 10:03:33

    遇到同样的问题!如果 index.html引用了js,需要删除,注释掉没有用。

  • css魔力
    2017-03-15 14:35:08

    inject:'body'改成inject:false,不要自动向index.html中插入js,然后在b和c页面的的插件配置中,chunks要引入'main',因为你的index.html有个直接引用的js,调用了 main.entry。然后加上excludeChunks:['a','c']和excludeChunks:['a','b'],排除掉不需要的chunk,就OK了