webpack引入SuperMap iClient3D 8C for Plugin

2024-02-25 10:58

本文主要是介绍webpack引入SuperMap iClient3D 8C for Plugin,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是webpack?

webpack是时下很火的一款代码打包工具,理念是“一切皆模块”,能把各种资源作为模块来使用。虽然webpack本身只能打包JS,但其有很多“loader”可以打包各种文件,使得其很强大。最近学习webpack,发现很适合管理三维SPA页面的管理,在此分享一下用webpack引入SuperMap iClent3D 8C for Plugin的方法。本文重点讲webpack配置文件webpack.config.js如何引入iClent3D库。

项目目录结构

项目目录结构

build:发布目录,
src: 源文件目录,
static: 静态引用目录,SuperMap iClent3D 8C for Plugin的库放该文件夹,通过打包SuperMap.Include.js动态加载,详见webpack.config.js配置文件的入口设置(entry )。

配置

package.json:描述包的文件,记录了项目的基本信息以及依赖的模块文件。
webpack.config.js: 每个项目下都必须有一个该配置文件,由它告知webpack需要做的工作。下面直接给出我用的配置文件,并附上注释帮助大家理解,参考该配置文件,不仅能引入iClent3d库,可全局引入jQuery和bootstrap。此配置文件适合webpack2.0,webpack1.0不适用。

webpack.config.js

```js require("./postcss.config.js"); var path = require("path"); var webpack = require("webpack"); /* * clean publishing directory * (清空发布目录) * */ var CleanWebpackPlugin = require('clean-webpack-plugin');

/*

  • create html
  • (创建html文件)
  • */
    var HtmlWebpackPlugin = require(‘html-webpack-plugin’);

/*

  • extract css
  • (提取css文件)
  • */
    var ExtractTextPlugin = require(“extract-text-webpack-plugin”);

/*

  • merge config
  • (合并config文件)
  • */
    var Merge = require(‘webpack-merge’);

/*

  • auto open browser
  • (自动打开浏览器)
  • */
    var OpenBrowserPlugin = require(‘open-browser-webpack-plugin’);

/*

  • Detect how npm is run and branch based on that
  • (当前 npm 运行)
  • */
    var currentTarget = process.env.npm_lifecycle_event;

var debug, // is debug
devServer, // is hmr mode
minimize; // is minimize

if (currentTarget == “build”) { // online mode (线上模式)

debug = false, devServer = false, minimize = true;

} else if (currentTarget == “dev”) { // dev mode (开发模式)

debug = true, devServer = false, minimize = false;

} else if (currentTarget == “dev-hmr”) { // dev HMR mode (热更新模式)

debug = true, devServer = true, minimize = false;

}

/*

  • proxy target address
  • (代理访问地址)
  • */
    var proxyTarget = ‘http://localhost:8888/’;

var PATHS = {
/*
* publish path
* (发布目录)
* */
publicPath: devServer ? ‘/webpack-iclent3d-demo/build/’ : ‘./’,

/** public resource path* (公共资源目录)* */
libsPath: path.resolve(process.cwd(), './libs'),/** resource path* (src 目录)* */
srcPath: path.resolve(process.cwd(), 'src'),/** node_modules path*/
node_modulesPath: path.resolve('./node_modules'),

}

var resolve = {
/*
* An array of extensions that should be used to resolve modules
* (引用时可以忽略后缀)
* */
extensions: [".js", “.css”, “.scss”, “.ejs”, “.png”, “.jpg”],

/** The directory (absolute path) that contains your modules* */modules: [path.resolve(__dirname, "src"), PATHS.node_modulesPath],/** Replace modules with other modules or paths.* (别名,引用时直接可以通过别名引用)* */
alias: {/** js* */bootstrap: path.join(PATHS.libsPath, "/bootstrap/js/bootstrap.js"), /*jquery: path.join(PATHS.libsPath, "/jquery/jquery.js"),*//** css* */bootstrapcss: path.join(PATHS.libsPath, "/bootstrap/css/bootstrap.css"),indexcss: path.join(PATHS.srcPath, "css/index.css"),
}

}

/*

  • The entry point for the bundle.

  • (入口)

  • */
    var entry = {

    /*

    • 主要入口文件index.js
    • */
      index: “./src/js/index.js”,

    /*

    • 第三方库,

    • */
      commons: [
      /*path.join(PATHS.libsPath, “/jquery/jquery.js”), */
      path.join(PATHS.libsPath, “/bootstrap/js/bootstrap.js”),

      // 这儿引入iClent3D库。
      path.join(PATHS.libsPath, “/supermap/SuperMap.Include.js”),
      ],
      };

/*

  • output options tell Webpack how to write the compiled files to disk

  • (webpack 编译后输出标识)

  • /
    var output = {
    /

    • determines the location on disk the files are written to
    • (输出目录)
    • */
      path: path.join(__dirname, ‘build’),

    /*

    • The publicPath specifies the public URL address of the output files when referenced in a browser
    • (发布后,资源的引用目录)
    • */
      publicPath: PATHS.publicPath,

    /*

    • Specifies the name of each output file on disk
    • (文件名称)
    • */
      filename: devServer ? ‘js/[name].js’ : ‘js/[name]-[chunkhash:8].js’,

    /*

    • The filename of non-entry chunks as relative path inside the output.path directory.
    • (按需加载模块时输出的文件名称)
    • */
      chunkFilename: devServer ? ‘js/[name].js’ : ‘js/[name]-[chunkhash:8].js’
      }

var rules = [{
/*
* 使用babel编译ES6/ES7/ES8为ES5代码
* 使用正则表达式匹配后缀名为.js的文件
*/
test: /.js$/,

    /** 排除node_modules目录下的文件, npm安装的包不需要编译*/exclude: /node_modules/,/** use指定该文件的loader, 值可以是字符串或者数组.* 这里先使用eslint-loader处理, 返回的结果交给babel-loader处理. loader的处理顺序是从最后一个到第一个.* eslint-loader用来检查代码, 如果有错误, 编译的时候会报错.* babel-loader用来编译js文件.*/enforce: "pre",//loader: ["babel-loader", "eslint-loader"]loader: ["babel-loader"]
},/** Exports HTML as string, require references to static resources.* (html loader)* */
{/** 匹配.html文件*/test: /\.html$/,/** 使用html-loader, 将html内容存为js字符串, 比如当遇到* import htmlString from './template.html';* template.html的文件内容会被转成一个js字符串, 合并到js文件里.*/use: "html-loader"
},/** img loader* */
{/** 匹配各种格式的图片文件* 上面html-loader会把html中<img>标签的图片解析出来, 文件名匹配到这里的test的正则表达式,* css-loader引用的图片和字体同样会匹配到这里的test条件.* */test: /\.(png|gif|jpe?g)$/,/** 使用url-loader, 它接受一个limit参数, 单位为字节(byte)* 当文件体积小于limit时, url-loader把文件转为Data URI的格式内联到引用的地方* 当文件大于limit时, url-loader会调用file-loader, 把文件储存到输出目录, 并把引用的文件路径改写成输出后的路径* 比如 views/foo/index.html中的<img src="smallpic.png">会被编译成* <img src="https://img-blog.csdnimg.cn/2022010618312718849.png">* 而<img src="largepic.png">会被编译成* <img src="/f78661bef717cf2cc2c2e5158f196384.png">* */use: [{loader: "url-loader",options: {limit: 10000,name: '/images/[name]-[hash:8].[ext]'}}]
},/** font loader* */
{test: /\.(eot|woff|woff2|ttf|svg)$/,use: [{loader: "url-loader",options: {limit: 5000,name: '/fonts/[name]-[hash:8].[ext]'}}]
},/** Extract css files* (提取css到单独文件loader)*/
{test: /\.css$/,loader: ExtractTextPlugin.extract({fallback: "style-loader",use: ["css-loader", "postcss-loader", "sass-loader"],publicPath: "./"})
},

];

var plugins = [

/** gloabal flag* (全局标识)* */
new webpack.DefinePlugin({/** dev flag* (开发标识)* */__DEV__: debug,/** proxy flag* (代理的标识)* */__DEVAPI__: devServer ? "/devApi/" : "''",
}),/** clean publishing directory* (发布前清空发布目录)* */
new CleanWebpackPlugin(['build'], {root: '', // An absolute path for the root  of webpack.config.jsverbose: true, // Write logs to console.//dry: false // Do not delete anything, good for testing.dry: devServer ? true : false
}),/** commons js* (公共js)* */
new webpack.optimize.CommonsChunkPlugin(/* devServer ?{name: "common", filename: "js/common.js"}:{names: ["common", "webpackAssets"]}*/{names: ["index", "commons", "webpackAssets"]}
),/**  Module (value) is loaded when the identifier (key) is used as free variable in a module*  (如:使用jquery 可以直接使用符号 "$")* */
new webpack.ProvidePlugin({$: "jquery",jQuery: "jquery","window.jQuery": "jquery","window.$": "jquery",
}),/** extract css* (提取css文件到单独的文件中)*/
new ExtractTextPlugin({filename: devServer ? "css/[name].css" : "css/[name]-[chunkhash:8].css",disable: false,allChunks: true
}),/**create html file* (创建html文件)* */
new HtmlWebpackPlugin({filename: 'index.html',template: __dirname + '/src/index.html',/** inject: true | 'head' | 'body' | false Inject all assets into the given template or templateContent -* When passing true or 'body' all javascript resources will be placed at the bottom of the body element.* 'head' will place the scripts in the head element.* */inject: 'true',// 需要依赖的模块chunks: ["index", "commons", "webpackAssets"],// 根据依赖自动排序chunksSortMode: 'dependency'
})

];

if (minimize) {

plugins.push(/** Uglify* (压缩)* */new webpack.optimize.UglifyJsPlugin({ // js、css都会压缩mangle: {except: ['$super', '$', /*'exports', 'require', 'module'*/ ]},compress: {warnings: false},output: {comments: false,}})
)

}

var config = {
/*
* 配置页面入口js文件
/
entry: entry,
/

* Like resolve but for loaders.
* (查找loader 的位置)
* */
/resolveLoader: {root: path.join(__dirname, “node_modules”)},/
output: output,
module: {
rules: rules
},
resolve: resolve,
plugins: plugins,

}

/*

  • Hrm setting

  • (开启热更新,并自动打开浏览器)

  • */
    if (devServer) {

    config = Merge(
    config, {
    plugins: [
    // Enable multi-pass compilation for enhanced performance
    // in larger projects. Good default.
    new webpack.HotModuleReplacementPlugin({
    multiStep: true
    }),
    new OpenBrowserPlugin({
    url: ‘http://localhost:8080’ + PATHS.publicPath + ‘index.html’
    })
    ],
    devServer: {
    // Enable history API fallback so HTML5 History API based
    // routing works. This is a good default that will come
    // in handy in more complicated setups.
    historyApiFallback: true,

             // Unlike the cli flag, this doesn't set// HotModuleReplacementPlugin!hot: true,inline: true,// Display only errors to reduce the amount of output.stats: 'errors-only',// Parse host and port from env to allow customization.//// If you use Vagrant or Cloud9, set// host: options.host || '0.0.0.0';//// 0.0.0.0 is available to all network devices// unlike default `localhost`.host: "localhost", // Defaults to `localhost`   process.env.HOSTport: 8080, // Defaults to 8080   process.env.PORT/**  代理访问*  1、可以绕过同源策略 和 webpack '热更新'结合使用*/proxy: {'/devApi/*': {target: proxyTarget,secure: true,stats: {colors: true},/** rewrite 的方式扩展性更强,不限制服务的名称* */rewrite: function (req) {console.log(req.url);req.url = req.url.replace(/^\/devApi/, '');}}}}}
    

    );
    }

module.exports = config;

<h2>SuperMap.Include.js</h2>
```js
function _IncludeScript(inc){var script='<'+'script type="text/javascript" src="..././static/lib_Realspace/'+inc+'"'+'><'+'/script>';document.writeln(script); 
}function _Include2DScript(inc){var script='<'+'script type="text/javascript" src="../../static/lib_Ajax/'+inc+'"'+'><'+'/script>';document.writeln(script); 
}if(!Function.__typeName)
{    _Include2DScript('MicrosoftAjax.js');_Include2DScript('SuperMap-7.0.1-11323.js');_IncludeScript('SuperMap.Web.Realspace.js');
}

结果

运行图片

源代码结构

如图页面能看见三维球,带有bootstrap风格,说明iClent3D库引入成功,jQuery和bootstrap引入成功。分享到此,有疑问欢迎留言提出,共同学习。

参考资料

1、前端模块化开发的价值;
2、webpack学习之路;
3、webpack1.0迁移到2.0。

这篇关于webpack引入SuperMap iClient3D 8C for Plugin的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/745257

相关文章

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

SW - 引入第三方dwg图纸后,修改坐标原点

文章目录 SW - 引入第三方dwg图纸后,修改坐标原点概述笔记设置图纸新原点END SW - 引入第三方dwg图纸后,修改坐标原点 概述 在solidworks中引入第三方的dwg格式图纸后,坐标原点大概率都不合适。 全图自动缩放后,引入的图纸离默认的原点位置差很多。 需要自己重新设置原点位置,才能自动缩放后,在工作区中间显示引入的图纸。 笔记 将dwg图纸拖到SW中

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号

步骤 1:安装 Version Number Plugin 登录 Jenkins 的管理界面。进入 “Manage Jenkins” -> “Manage Plugins”。在 “Available” 选项卡中搜索 “Version Number Plugin”。选中并安装插件,完成后可能需要重启 Jenkins。 步骤 2:配置版本号生成 打开项目配置页面。在下方找到 “Build Env

YOLOv8改进实战 | 注意力篇 | 引入CVPR2024 PKINet 上下文锚点注意力CAAttention

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8 是一种尖端的、最先进的 (SOTA) 模型,它建立在以前成功的 YOLO 版本的基础上,并引入了新的功能和改进,以

SuperMap iManger 单个镜像更新流程

1. 下载镜像 docker pull registry.cn-beijing.aliyuncs.com/supermap/common-dashboard-api:11.1.1-240802-amd64 label 没区分架构,在 x64 环境 pull arm64 镜像 通过 --platform=arm64 参数可以实现 docker pull mariadb:10.5.26

fetch-event-source 如何通过script全局引入

fetchEventSource源码中导出了两种类型的包cjs和esm。但是有个需求如何在原生是js中通过script标签引呢?需要加上type=module。今天介绍另一种方法 下载源码文件: https://github.com/Azure/fetch-event-source.git 安装: npm install --save-dev webpack webpack-cli ts

YOLOv8改进 | Conv篇 | YOLOv8引入DWR

1. DWR介绍 1.1  摘要:当前的许多工作直接采用多速率深度扩张卷积从一个输入特征图中同时捕获多尺度上下文信息,从而提高实时语义分割的特征提取效率。 然而,这种设计可能会因为结构和超参数的不合理而导致多尺度上下文信息的访问困难。 为了降低多尺度上下文信息的绘制难度,我们提出了一种高效的多尺度特征提取方法,将原始的单步方法分解为区域残差-语义残差两个步骤。 在该方法中,多速率深度扩张卷积

机器学习模型中的因果关系:引入单调约束

单调约束是使机器学习模型可行的关键,但它们仍未被广泛使用欢迎来到雲闪世界。 碳ausality 正在迅速成为每个数据科学家工具包中必不可少的组成部分。 这是有充分理由的。 事实上,因果模型在商业中具有很高的价值,因为它们为“假设”情景提供了更可靠的估计,特别是在用于做出影响业务结果的决策时。 在本文中,我将展示如何通过简单的更改(实际上添加一行代码)将传统的 ML 模型(如随机森林、L

Kubernetes 1.25 containerd 环境部署 SuperMap iManager

超图官网目提供的Kubernetes 版本为 1.20 版本,容器运行时为 docker 本次部署使用已有的 Kubernetes 1.25 版本集群,容器运行时为 containerd Kubernetes ,containerd 部署请自行了解,本次不做介绍,下面介绍在此环境上如何部署 iManager 11i 并创建云套件 1. 环境介绍 虚拟机 CPU 内存 操作系统 Ku