使用webpack搭建pixi.js开发环境


Posted in Javascript onFebruary 12, 2020

本文介绍怎么使用webpack搭建pixi.js游戏的开发环境,怎么配置babel将ES6+代码最终转换为ES5,怎么利用gulp将webpack和其他脚本粘合一起优化项目并最终发布项目。

前提

  • 需要会简单使用nodejs,了解package.json,会简单使用npm init,npm install,npm run命令。
  • 需要稍微了解webpack和gulp。
  • 需要有google chrome浏览器。
  • 最好会一点git,demo项目pixi-webpack-demo托管在github上,通过切换不同分支演示一步一步项目的构建过程,现在把项目clone下来吧。

为了更容易理解,这里先贴出来项目最终的目录结构

.
├── dist
│  ├── index.html
│  ├── game.min.js
│  └── assets
│    └── bunny.png
├── src
│  ├── index.html
│  ├── assets
│  │  └── bunny.png
│  └── js
│    ├── main.js
│    └── scene.js
├── gulpfile.js
├── package.json
├── webpack.common.js
├── webpack.dev.js
└── webpack.prod.js

构建环境

  • nodejs:需要node环境,前端项目现在基本都是基于node项目创建的,node的包管理系统和工具链很方便。
  • git:非必须,看demo时候切分支用。

初始化项目

运行git checkout init切换到init分支即可看到这一步的示例。

  • 创建目录pixi-webpack-demo,在pixi-webpack-demo根目录下运行npm init命令初始化项目,按照提示输入项目信息,完成后生成一个package.json文件。
  • 运行npm install --save pixi.js安装依赖。
  • 完成上面两步,package.json文件如下所示:
{
 "name": "pixi-webpack-demo",
 "version": "1.0.0",
 "description": "make pixi.js game with webpack and gulp",
 "main": "src/js/main.js",
 "keywords": ["pixi.js","webpack"],
 "author": "yulijun",
 "license": "MIT",
 "dependencies": {
  "pixi.js": "^5.2.1"
 }
}

创建文件src/index.html。

<html>
 <head>
  <title>pixi-webpack-demo</title>
 </head>
 <body>
 <canvas id="scene"></canvas>
  <!-- 注意这里的game.min.js文件,稍微在“引入webpack”步骤详细解释它-->
  <script type="text/javascript" src="game.min.js" charset="utf-8"></script>
 </body>
</html>

创建文件src/js/main.js,这个文件是游戏入口文件。

import * as PIXI from 'pixi.js'

const app = new PIXI.Application({
 width: 720,
 height: 1280,
 backgroundColor: 0x1099bb,
 view: document.querySelector('#scene')
});

const texture = PIXI.Texture.from('assets/bunny.png');
const bunny = new PIXI.Sprite(texture);
bunny.anchor.set(0.5);
bunny.x = 160
bunny.y = 160
app.stage.addChild(bunny);

app.ticker.add((delta) => {
 bunny.rotation -= 0.01 * delta;
});

引入webpack

运行git checkout webpack切换到webpack分支即可看到这一步的示例。

  1. 运行npm install --save-dev webpack webpack-dev-server webpack-cli webpack-merge安装依赖。
  2. 创建webpack.common.js文件,这个是webpack公共配置。
const path = require('path')
module.exports = {
 //游戏入口文件
 entry: ['./src/js/main.js'],
 output: {
  //js文件最终发布到哪个路径
  path: path.resolve(__dirname, 'dist'),
  
  //注意这个名字和刚才html里面的名字必须一致。
  //开发阶段webpack会自动处理这个文件让html引用到,虽然磁盘上不会有这个文件。
  //但是最终发布项目的时候会生成这个文件。
  filename: 'game.min.js',
 },
 target: 'web'
}

创建webpack.dev.js文件,这个配置文件用于开发调试阶段。

const path = require('path')
const merge = require('webpack-merge')
const common = require('./webpack.common.js')
module.exports = merge(common, {
 devtool: 'inline-source-map',
 mode: 'none',
 devServer: {
  //调试时候源代码的位置
  contentBase: path.join(__dirname, 'src'),
  port: 8080,
  host: '0.0.0.0',
  hot: true
 }
})

创建webpack.prod.js文件,这个配置文件用于发布项目(稍后在引入babel和发布项目步骤再详细介绍,这里暂时先贴出来),这里配置了babel转码、tree shake和生成source map等。

const merge = require('webpack-merge')
const common = require('./webpack.common.js')
module.exports = merge(common, {
 'mode':'production',
 devtool: 'source-map',
 module: {
  rules: [{
   test: /\.js$/,
   exclude: /node_modules/,
   use: {
    loader: 'babel-loader',
    options: {
     presets: [
      ['@babel/preset-env', {
       'corejs': '3',
       'useBuiltIns': 'usage'
      }]
     ],
     plugins: ['@babel/plugin-transform-runtime']
    }
   }
  }]
 }
})

在package.json中的script配置节增加启动命令。

{
 "name": "pixi-webpack-demo",
 "version": "1.0.0",
 "description": "make pixi.js game with webpack and gulp",
 "main": "src/js/main.js",
 "keywords": ["pixi.js","webpack"],
 "author": "yulijun",
 "license": "MIT",
 "scripts": {
  "start": "webpack-dev-server --open 'google chrome' --config webpack.dev.js"
 },
 "devDependencies": {
  "webpack": "^4.41.5",
  "webpack-cli": "^3.3.10",
  "webpack-dev-server": "^3.10.3",
  "webpack-merge": "^4.2.2"
 },
 "dependencies": {
  "pixi.js": "^5.2.1"
 }
}

现已成功引入了webpack,运行npm start启动项目,会自动打开chrome浏览器,我们看到游戏已经跑起来了!尝试修改src/js/main.js文件,保存下,页面会自动刷新,我们的修改也已经能反映到页面上了!

构建项目

运行git checkout master切换到master分支即可看到这最终一步的示例。

  • 引入babel让你能使用最新的ES特性(这些库主要是为了ES6+转ES5,还有些pollyfill等等,这里不做过多的解释,具体可参考babel官方文档)。
    • npm install --save-dev @babel/core @babel/plugin-transform-runtime @babel/preset-env babel-loader
    • npm install --save core-js @babel/runtime
  • 引入gulp,运行npm install --save-dev gulp gulp-if gulp-imagemin rimraf安装依赖。
  • 创建gulpfile.js
const {
 src,
 dest,
 parallel
} = require('gulp')
const path = require('path')
const gulpif = require('gulp-if')
const imagemin = require('gulp-imagemin')
const webpack = require('webpack')
const webpack_config = require('./webpack.prod')

function copyAssets() {
 return src(['src/**/*', '!src/js/**'])
  .pipe(gulpif(
   file => path.extname(file.relative) === '.png',
   imagemin([imagemin.optipng({
    optimizationLevel: 3
   })], {
    verbose: true
   })))
  .pipe(dest('dist'))
}

function jsBundle(next) {
 const compiler = webpack(webpack_config)
 compiler.run((err, stats) => {
  if (err || stats.hasErrors()) {
   console.error(stats.toJson().errors)
  }
  next()
 })
}

exports.dist = parallel(copyAssets, jsBundle)

在package.json中script节加入构建相关命令,然后run npm build就能成功打包了!

{
 "name": "pixi-webpack-demo",
 "version": "1.0.0",
 "description": "make pixi.js game with webpack and gulp",
 "main": "src/js/main.js",
 "scripts": {
  "start": "webpack-dev-server --open 'google chrome' --config webpack.dev.js",
  "clean": "rimraf dist",
  "prebuild": "npm run clean",
  "build": "gulp dist"
 },
 "author": "yulijun",
 "keywords": ["pixi.js","webpack"],
 "license": "MIT",
 "devDependencies": {
  "@babel/core": "^7.8.4",
  "@babel/plugin-transform-runtime": "^7.8.3",
  "@babel/preset-env": "^7.8.4",
  "babel-loader": "^8.0.6",
  "rimraf": "^3.0.2",
  "gulp": "^4.0.0",
  "gulp-if": "^2.0.2",
  "gulp-imagemin": "^4.1.0",
  "webpack": "^4.41.5",
  "webpack-cli": "^3.3.10",
  "webpack-dev-server": "^3.10.3",
  "webpack-merge": "^4.2.2"
 },
 "dependencies": {
  "@babel/runtime": "^7.8.4",
  "core-js": "^3.6.4",
  "pixi.js": "^5.2.1"
 }
}

恭喜你,至此开发和构建环境已经全部完成,可尝试在源码中添加一些es6+语法,然后运行npm run build构建项目,最终打包好的项目会在dist目录中,js已经被混淆并合并为game.min.js,无用的引用通过tree shake已经被去掉了,包尺寸优化到了最小,而且所有es6+的语法均转换为es5以适应更多的浏览器。所有的图片也都进行了压缩处理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript实际应用:innerHTMl和确认提示的使用
Jun 22 Javascript
判断输入是否为空,获得输入类型的JS代码
Oct 30 Javascript
JS小功能(checkbox实现全选和全取消)实例代码
Nov 28 Javascript
第五章之BootStrap 栅格系统
Apr 25 Javascript
vue2.0 axios前后端数据处理实例代码
Jun 30 Javascript
基于JavaScript实现前端数据多条件筛选功能
Aug 19 Javascript
Vue 项目部署到服务器的问题解决方法
Dec 05 Javascript
浅谈 Vue 项目优化的方法
Dec 16 Javascript
学习JS中的DOM节点以及操作
Apr 30 Javascript
js实现图片上传并预览功能
Aug 06 Javascript
微信开发之微信jssdk录音功能开发示例
Oct 22 Javascript
详解@angular/cli 改变默认启动端口两种方式
Nov 29 Javascript
十分钟教你上手ES2020新特性
Feb 12 #Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
Feb 12 #Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
Feb 12 #Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
Feb 12 #Javascript
浅析vue-router实现原理及两种模式
Feb 11 #Javascript
vue-socket.io跨域问题有效解决方法
Feb 11 #Javascript
Vue开发中遇到的跨域问题及解决方法
Feb 11 #Javascript
You might like
php学习笔记 面向对象的构造与析构方法
2011/06/13 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
2021/03/09 PHP
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
window.location不跳转的问题解决方法
2014/04/17 Javascript
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
js的三种继承方式详解
2017/01/21 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
2017/01/23 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
vuex actions异步修改状态的实例详解
2019/11/06 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
python使用socket进行简单网络连接的方法
2015/04/29 Python
python字符串的方法与操作大全
2018/01/30 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
电子商务专业推荐信范文
2013/12/02 职场文书
教师实习自我鉴定
2013/12/13 职场文书
班级道德讲堂实施方案
2014/02/24 职场文书
争先创优活动总结
2014/08/27 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
公民授权委托书
2014/10/15 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
关于战胜挫折的名言警句大全!
2019/07/05 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS
python如何利用traceback获取详细的异常信息
2021/06/05 Python