• webpack打包工具之ts版开发框架搭建


    本文用两个框架,一个是threejs,一个是phaser3,其实流程都是一样。

    nodejs、npm是基础,不再多说!

    首先新建一个文件夹命名three-study,然后npm init -y

    用webpack工具,第一步要安装webpack主功能包:

    npm i webpack --save-dev
    
    npm i webpack-cli --save-dev

    这两个包是webpack最基础的包,如果仅仅只是用于打包,这两个足够了(--save-dev的意思是仅仅用于开发环境)。

    接下来第二步为里调试方便,需要安装webpack-dev-server

    npm i webpack-dev-server --save-dev

    这个包是一个用来快速搭建本地运行环境的工具,通常情况下package.json里的dev或start调试模式都是用它,常用方式:

    webpack-dev-server --config webpack.conf.js

    其相关配置可自行百度,一般会配置到webpack.conf.js里。

    第三步:安装html-webpack-plugin

    npm i html-webpack-plugin --save-dev

    这个包就是将打包后的js自动添加到目标index.html模板文件里,省去每次打包都手动操作的麻烦。

    第三步:安装ts-loader,typescript,这是ts语言的配置,所有用到ts开发的都必须安装这两个依赖

    npm i ts-loader --save-dev
    npm i typescript --save-dev

    第四步:创建ts配置文件,tsconfig.json,ts的运行必须要有tsconfig文件,否则无法运行和转换成js,我的配置如下:

    {
        "compilerOptions": {
            "module": "commonjs",
            "sourceMap": true,
            "target": "es5"
        },
        "include": [
            "src/*"
        ],
        "exclude": [
            "node_modules"
        ]
    }

    接下来安装file-loader和clean-webpack-plugin,file-loader用于资源加载配置,而clean-webpack-plugin则仅仅是打包的时候清除本地原来的打包文件,相当于保持最新,非必须

    npm i file-loader --save-dev
    npm i clean-webpack-plugin --save-dev

    到这里所有工具依赖全部安装完成,接下来就是我们要开发的包如phaser或threejs,这里注意一定要安装到依赖环境,即--save 而不是--save-dev

    npm i three --save

    整个package.json依赖如下

    {
      "name": "three-study",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "start":"webpack-dev-server --config webpack.conf.js",
        "test": "echo "Error: no test specified" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "clean-webpack-plugin": "^3.0.0",
        "file-loader": "^5.0.2",
        "html-webpack-plugin": "^3.2.0",
        "ts-loader": "^6.2.1",
        "typescript": "^3.7.3",
        "webpack": "^4.41.2",
        "webpack-cli": "^3.3.10",
        "webpack-dev-server": "^3.9.0"
      },
      "dependencies": {
        "three": "^0.111.0"
      }
    }

    好了,接下来配置webpack.conf.js文件,让程序运行起来,我的配置如下

    const path = require("path");
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
        mode:'development',
        entry:'./src/Main.ts',
        output:{
            path:path.resolve(__dirname,'./public'),
            filename:'app.bundle.js'
        },
        devServer:{
            //设置服务器访问的基本目录
            contentBase:path.resolve(__dirname,'./public'),
            host:'172.18.27.110',
            port:1222, // 设置端口号
            inline:true 
        },
        module:{
            rules:[
                {
                    test:/.tsx?$/,
                    use:'ts-loader',
                    exclude:/node_modules/
                },
                {
                    test:/.(png|jpe?g|gif|svg)(?.*)?$/,
                    use:{
                        loader:'file-loader',
                        options:{
                            name:'[name].[ext]',
                            outputPath:'assets/'
                        }
                    }
                }
            ]
        },
        resolve:{
            extensions:['.ts','.tsx','.js']
        },
        devtool:"eval",
        plugins:[
            new HtmlWebpackPlugin({
                template:'index.html'
            })
        ]
    }

    其中172.18.27.110是我自己电脑的局域网ip,其他各项配置均可查询官方文档,这里不再扯远。

    最后一步,根目录创建一个index.html模板文件,然后创建一个src和public文件夹,public文件夹主要用来存放资源,在src下创建一个Main.ts文件,编写代码如下

    import * as THREE from 'three'
    
    class Main{
        constructor(){
            this.init();
        }
        private scene:THREE.Scene;
        private camera:THREE.Camera;
        private renderer:THREE.WebGLRenderer;
        private myCube:THREE.Mesh;
        private init(){
            let scene = new THREE.Scene();
            this.scene = scene;
            let camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,.01,1000);
            this.camera = camera;
            let renderer = new THREE.WebGLRenderer();
            renderer.setSize(window.innerWidth,window.innerHeight);
            document.body.appendChild(renderer.domElement);
            this.renderer = renderer;
    
            let geometry = new THREE.BoxGeometry(1,1,1);
            let material = new THREE.MeshBasicMaterial({color:0xfff000});
            let cube = new THREE.Mesh(geometry,material);
            scene.add(cube);
            this.myCube = cube;
    
            camera.position.z = 5;
    
            this.animate();
        }
    
        private animate(){
            requestAnimationFrame(this.animate.bind(this));
            this.renderer.render(this.scene,this.camera);
            this.loop();
        }
    
        private loop(){
            this.myCube.rotation.x += 0.01;
            this.myCube.rotation.y += 0.01;
            this.myCube.rotation.z += 0.01;
        }
    }
    new Main();

    在命令行运行npm run start,然后打开浏览器输入172.18.27.110:1222即可看到如下效果

     对于phaser,也是如此配置,这里仅仅配置里一个dev环境,其实还有个线上打包环境,我一般分成dev.conf.js和prd.conf.js,分别代表dev和生产环境,这里有个生产环境配置可作参考

    const path = require("path");
    const CleanWebpackPlugin = require("clean-webpack-plugin").CleanWebpackPlugin;
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
        mode:'production',
        devtool:"source-map",
        entry:'./src/Main.ts',
        output:{
            filename:'js/[name].[chunkhash].js',
            path:path.resolve(__dirname,'.././dist')
        },
        module:{
            rules:[
                {
                    test:/.tsx?$/,
                    use:'ts-loader',
                    exclude:/node_modules/
                },
                {
                    test:/.(png|jpe?g|gif|svg)(?.*)?$/,
                    use:{
                        loader:'file-loader',
                        options:{
                            name:'[name].[ext]',
                            outputPath:'assets/'
                        }
                    }
                }
            ]
        },
        resolve:{
            extensions:['.ts','.tsx','.js']
        },
        optimization:{
            splitChunks:{
                name:"vendor",
                chunks:"all"
            }
        },
        plugins:[
            new CleanWebpackPlugin(),
            new HtmlWebpackPlugin({
                template:'index.html'
            })
        ]
    }
  • 相关阅读:
    2019-2020-1 20175301 20175305 20175318 实验三 实时系统
    2019-2020-2-20175301 20175305 20175318-实验二固件程序设计
    2019-2020-1 20175301 20175305 20175318 实验一 开发环境的熟悉
    2019-2020-1 20175305 《信息安全系统设计基础》第4周学习总结
    20175305 《信息安全系统设计基础》第1-2周学习总结
    2018-2019-2 20175305 实验五《网络编程与安全》实验报告
    2018-2019-2 20175305实验四《Android程序设计》实验报告
    20175305张天钰《java程序设计》第十一周学习总结
    使用 JDK11 遇到的问题
    Oracle 从 dual 表中查询返回多行记录
  • 原文地址:https://www.cnblogs.com/wangzisheng/p/11993919.html
Copyright © 2020-2023  润新知