使用webpack搭建pixi.js開(kāi)發(fā)環(huán)境
本文介紹怎么使用webpack搭建pixi.js游戲的開(kāi)發(fā)環(huán)境,怎么配置babel將ES6+代碼最終轉(zhuǎn)換為ES5,怎么利用gulp將webpack和其他腳本粘合一起優(yōu)化項(xiàng)目并最終發(fā)布項(xiàng)目。
前提
- 需要會(huì)簡(jiǎn)單使用nodejs,了解package.json,會(huì)簡(jiǎn)單使用npm init,npm install,npm run命令。
- 需要稍微了解webpack和gulp。
- 需要有g(shù)oogle chrome瀏覽器。
- 最好會(huì)一點(diǎn)git,demo項(xiàng)目pixi-webpack-demo托管在github上,通過(guò)切換不同分支演示一步一步項(xiàng)目的構(gòu)建過(guò)程,現(xiàn)在把項(xiàng)目clone下來(lái)吧。
為了更容易理解,這里先貼出來(lái)項(xiàng)目最終的目錄結(jié)構(gòu)
. ├── 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
構(gòu)建環(huán)境
- nodejs:需要node環(huán)境,前端項(xiàng)目現(xiàn)在基本都是基于node項(xiàng)目創(chuàng)建的,node的包管理系統(tǒng)和工具鏈很方便。
- git:非必須,看demo時(shí)候切分支用。
初始化項(xiàng)目
運(yùn)行g(shù)it checkout init切換到init分支即可看到這一步的示例。
- 創(chuàng)建目錄pixi-webpack-demo,在pixi-webpack-demo根目錄下運(yùn)行npm init命令初始化項(xiàng)目,按照提示輸入項(xiàng)目信息,完成后生成一個(gè)package.json文件。
- 運(yùn)行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"
}
}
創(chuàng)建文件src/index.html。
<html> <head> <title>pixi-webpack-demo</title> </head> <body> <canvas id="scene"></canvas> <!-- 注意這里的game.min.js文件,稍微在“引入webpack”步驟詳細(xì)解釋它--> <script type="text/javascript" src="game.min.js" charset="utf-8"></script> </body> </html>
創(chuàng)建文件src/js/main.js,這個(gè)文件是游戲入口文件。
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
運(yùn)行g(shù)it checkout webpack切換到webpack分支即可看到這一步的示例。
- 運(yùn)行npm install --save-dev webpack webpack-dev-server webpack-cli webpack-merge安裝依賴。
- 創(chuàng)建webpack.common.js文件,這個(gè)是webpack公共配置。
const path = require('path')
module.exports = {
//游戲入口文件
entry: ['./src/js/main.js'],
output: {
//js文件最終發(fā)布到哪個(gè)路徑
path: path.resolve(__dirname, 'dist'),
//注意這個(gè)名字和剛才html里面的名字必須一致。
//開(kāi)發(fā)階段webpack會(huì)自動(dòng)處理這個(gè)文件讓html引用到,雖然磁盤上不會(huì)有這個(gè)文件。
//但是最終發(fā)布項(xiàng)目的時(shí)候會(huì)生成這個(gè)文件。
filename: 'game.min.js',
},
target: 'web'
}
創(chuàng)建webpack.dev.js文件,這個(gè)配置文件用于開(kāi)發(fā)調(diào)試階段。
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: {
//調(diào)試時(shí)候源代碼的位置
contentBase: path.join(__dirname, 'src'),
port: 8080,
host: '0.0.0.0',
hot: true
}
})
創(chuàng)建webpack.prod.js文件,這個(gè)配置文件用于發(fā)布項(xiàng)目(稍后在引入babel和發(fā)布項(xiàng)目步驟再詳細(xì)介紹,這里暫時(shí)先貼出來(lái)),這里配置了babel轉(zhuǎn)碼、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配置節(jié)增加啟動(dòng)命令。
{
"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"
}
}
現(xiàn)已成功引入了webpack,運(yùn)行npm start啟動(dòng)項(xiàng)目,會(huì)自動(dòng)打開(kāi)chrome瀏覽器,我們看到游戲已經(jīng)跑起來(lái)了!嘗試修改src/js/main.js文件,保存下,頁(yè)面會(huì)自動(dòng)刷新,我們的修改也已經(jīng)能反映到頁(yè)面上了!
構(gòu)建項(xiàng)目
運(yùn)行g(shù)it checkout master切換到master分支即可看到這最終一步的示例。
- 引入babel讓你能使用最新的ES特性(這些庫(kù)主要是為了ES6+轉(zhuǎn)ES5,還有些pollyfill等等,這里不做過(guò)多的解釋,具體可參考babel官方文檔)。
- npm install --save-dev @babel/core @babel/plugin-transform-runtime @babel/preset-env babel-loader
- npm install --save core-js @babel/runtime
- 引入gulp,運(yùn)行npm install --save-dev gulp gulp-if gulp-imagemin rimraf安裝依賴。
- 創(chuàng)建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節(jié)加入構(gòu)建相關(guān)命令,然后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"
}
}
恭喜你,至此開(kāi)發(fā)和構(gòu)建環(huán)境已經(jīng)全部完成,可嘗試在源碼中添加一些es6+語(yǔ)法,然后運(yùn)行npm run build構(gòu)建項(xiàng)目,最終打包好的項(xiàng)目會(huì)在dist目錄中,js已經(jīng)被混淆并合并為game.min.js,無(wú)用的引用通過(guò)tree shake已經(jīng)被去掉了,包尺寸優(yōu)化到了最小,而且所有es6+的語(yǔ)法均轉(zhuǎn)換為es5以適應(yīng)更多的瀏覽器。所有的圖片也都進(jìn)行了壓縮處理。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
js調(diào)試系列 控制臺(tái)命令行API使用方法
上次初步介紹了什么是控制臺(tái),以及簡(jiǎn)單的 console.log 輸出信息。最后還有兩個(gè)小問(wèn)題,我們就當(dāng)回顧,來(lái)看下怎么操作吧2014-06-06
js手機(jī)號(hào)4位顯示空格,銀行卡每4位顯示空格效果
這篇文章主要介紹了js手機(jī)號(hào)4位顯示空格,銀行卡每4位顯示空格效果,手機(jī)號(hào)和銀行卡號(hào),按照每4位顯示一個(gè)空格的需求,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-03-03
Javascript 中創(chuàng)建自定義對(duì)象的方法匯總
這篇文章主要匯總介紹了Javascript 中創(chuàng)建自定義對(duì)象的方法,需要的朋友可以參考下2014-12-12
Array.prototype.slice.apply的使用方法
arguments在JavaScript語(yǔ)法中是函數(shù)特有的一個(gè)對(duì)象屬性(Arguments對(duì)象),用來(lái)引用調(diào)用該函數(shù)時(shí)傳遞的實(shí)際參數(shù)。2010-03-03
讓插入到 innerHTML 中的 script 跑起來(lái)的實(shí)現(xiàn)代碼
在做 ajax 編程時(shí),我們常常需要將 xmlhttp 獲取到的頁(yè)面內(nèi)容通過(guò) innerHTML 來(lái)賦給某個(gè)容器(比如 div、span 或者 td 等),但是這里存在一個(gè)問(wèn)題,就是我們將要賦給 innerHTML 的頁(yè)面內(nèi)容如果包含有腳本程序,這些腳本程序不管是外部腳本,還是內(nèi)部腳本,可能(1)都不會(huì)被執(zhí)行。2006-07-07

