使用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 相关文章推荐
jQuery在vs2008及js文件中的无智能提示的解决方法
Dec 30 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
Nov 17 Javascript
javascript object array方法使用详解
Dec 03 Javascript
Jquery 模板数据绑定插件的使用方法详解
Jul 08 Javascript
js正则表达式的使用详解
Jul 09 Javascript
node.js中的fs.statSync方法使用说明
Dec 16 Javascript
jQuery中用dom操作替代正则表达式
Dec 29 Javascript
移动端js触摸事件详解
Sep 18 Javascript
Bootstrap页面缩小变形的快速解决办法
Feb 03 Javascript
Bootstrap导航简单实现代码
Mar 06 Javascript
JS对象与json字符串相互转换实现方法示例
Jun 14 Javascript
小程序实现多列选择器
Feb 15 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实现统计邮件大小的方法
2013/08/06 PHP
php伪静态之APACHE篇
2014/06/02 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
php绘图之生成饼状图的方法
2015/01/24 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
JS处理VBArray的函数使用说明
2008/05/11 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
JS判断客服QQ号在线还是离线状态的方法
2015/01/13 Javascript
浅谈jQuery构造函数分析
2015/05/11 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
Vue0.1的过滤代码如何添加到Vue2.0直接使用
2017/08/23 Javascript
Vue header组件开发详解
2018/01/26 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
Vue 实现展开折叠效果的示例代码
2018/08/27 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
Python3 Random模块代码详解
2017/12/04 Python
Python获取当前公网ip并自动断开宽带连接实例代码
2018/01/12 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
用django-allauth实现第三方登录的示例代码
2019/06/24 Python
关于Pytorch的MNIST数据集的预处理详解
2020/01/10 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
在什么时候需要使用"常引用"
2015/12/31 面试题
2014年迎新年联欢会活动策划方案
2014/02/26 职场文书
2015年党风廉政承诺书
2015/01/22 职场文书
2015年团支部工作总结
2015/04/03 职场文书