Gruntjs 在项目中尝试使用自定义ES6 Phaser.Plugin时,找不到模块
我正在尝试编写一个ES6类导入程序,但在跨文件导入ES6类时遇到问题。当前设置构建良好,您可以看到输出。然而,当我尝试在实际的Phaser游戏中使用编译后的插件时Gruntjs 在项目中尝试使用自定义ES6 Phaser.Plugin时,找不到模块,gruntjs,ecmascript-6,browserify,babeljs,phaser-framework,Gruntjs,Ecmascript 6,Browserify,Babeljs,Phaser Framework,我正在尝试编写一个ES6类导入程序,但在跨文件导入ES6类时遇到问题。当前设置构建良好,您可以看到输出。然而,当我尝试在实际的Phaser游戏中使用编译后的插件时 import '../plugins/phaser-dynamic-state-transition'; 我的林特发现了这个错误 Cannot find module './TransitionStateManager' from '~/src/plugins' 从这一点上,我知道它正在成功地找到内置的ES5插件,并试图将其导入到
import '../plugins/phaser-dynamic-state-transition';
我的林特发现了这个错误
Cannot find module './TransitionStateManager' from '~/src/plugins'
从这一点上,我知道它正在成功地找到内置的ES5插件,并试图将其导入到游戏中。此外,当插件的src中只有1个文件时,它也是成功的。在游戏中添加第二个文件TransitionStateManager时会出现问题,即使它编译得很好
你知道为什么会这样吗
编辑:
您可以在GitHub repo中看到所有代码。然而,为了方便起见,这里是我的Gruntfile.js
module.exports = function (grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
//allow import/export of JS classes
browserify: {
dist: {
options: {
transform: [ //transform ES6 code to ES5 code
["babelify", {
loose: "all"
}]
]
},
files: {
"./dist/<%= pkg.name %>.js": ["./src/index.js"]
}
}
},
//turn the output js file into a minified file (use less kB)
uglify: {
dist: {
files: {
"./dist/<%= pkg.name %>.min.js": ["./dist/<%= pkg.name %>.js"]
}
}
},
//define the watch task: build when you save an edit
watch: {
scripts: {
files: ["./src/*.js"],
tasks: ["build"]
}
}
});
grunt.loadNpmTasks("grunt-browserify");
grunt.loadNpmTasks("grunt-contrib-watch");
grunt.loadNpmTasks("grunt-contrib-uglify");
grunt.registerTask("build", ["browserify","uglify"]);//define the modules that will run in the build task
grunt.registerTask("default", ["build","watch"]); //build and then start watching the files for changes
};
module.exports=函数(grunt){
grunt.initConfig({
pkg:grunt.file.readJSON('package.json'),
//允许导入/导出JS类
浏览:{
地区:{
选项:{
转换:[//将ES6代码转换为ES5代码
[“宝贝”{
松散:“全部”
}]
]
},
档案:{
“/dist/.js”:[“/src/index.js”]
}
}
},
//将输出js文件转换为缩小文件(使用更少的kB)
丑陋的:{
地区:{
档案:{
“/dist/.min.js”:[“/dist/.js”]
}
}
},
//定义监视任务:保存编辑时生成
观察:{
脚本:{
文件:[“/src/*.js”],
任务:[“构建”]
}
}
});
grunt.loadNpmTasks(“grunt browserify”);
grunt.loadNpmTasks(“grunt contrib watch”);
grunt.loadNpmTasks(“grunt contrib uglify”);
grunt.registerTask(“build”、[“browserify”、“uglify”]);//定义将在构建任务中运行的模块
registerTask(“default”,[“build”,“watch”]);//构建并开始查看文件的更改
};
编辑:
我运行grunt
,源文件被捆绑并输出到一个文件中。我把那个文件复制到我游戏项目的src/plugins
文件夹中。在我的src
文件夹中,我有一个文件Preload.js
,其中有一行import'../plugins/phaser dynamic state transition'代码>。此时,我出现了大量错误,告诉我缺少。/TransitionStateManager'
编辑:
我目前使用的是NPM的这个,我发现如果我直接下载并尝试引用它,我会有同样的错误…即使它在NPM中运行良好
工作时间:1<代码>npm安装移相器状态转换--保存
2。通过导入“移相器状态转换”消费代码>
不工作:1。2.通过import'../plugins/phaser state transition'消费代码>
编辑:
因此,如果我在GitHub repo和我自己的repo上都使用缩小版(使用uglify插件构建),它就可以工作。不知道为什么会这样做,但非精简版不会这样做。当以前的Browserify捆绑包(您的插件)位于当前正在Browserify(您的游戏)的依赖关系图中时,可能会发生这种情况。简而言之,Browserify无法识别上一个bundle现在是自包含的,并尝试解析其中的require()
调用。您可以在中看到我更详细的描述
可能的解决办法是:
- 取消之前的捆绑包(您的插件)。这也是你想要做的,如果你要分发插件
- 缩小它,正如你所发现的
- 执行第二个捆绑包(游戏)时使用
noParse
选项
另请参见。您是否可以在问题中包括您的browserify配置?已更新。谢谢你看!您提到您正在尝试使用编译后的插件(您是指构建包吗?);你想怎么使用/消费它?@James是消耗插件的phaser游戏,它也被浏览了?通常情况下,当您尝试浏览某个包含Browserify包的内容时会发生这种情况,原因我在中解释过。缩小是一种解决方案,正如你发现的,正如我在那里和那里提到的。您可以取消对它的要求,以减少对源代码的中断(如果您要分发它,您应该这样做),或者使用源代码映射进行缩小。谢谢@JamesLowrey!我认为这里有一些规范的答案功能,所以…我应该研究一下,看看我是否可以为此创建一个,并指出所有的问题,因为它们听起来可能非常不同,但有相同的根本原因。