狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

帶你上手全新版本的Webpack 5

admin
2024年4月3日 10:59 本文熱度 784
本文分享自華為云社區(qū)《webpack5快速入門,船新版本,建議收藏》,作者:北極光之夜。。

一. 快速上手

1.1 Webpack功能:

打包: 將不同類型資源按模塊處理進(jìn)行打包。
靜態(tài): 打包后最終產(chǎn)出靜態(tài)資源。
模塊: webpack 支持不同規(guī)范的模塊化開發(fā)。

1.2 安裝webpack:

終端輸入: npm install webpack -g

1.3 快速模擬搭建一個項目目錄:

utiles.js:

function add(a,b){     console.log(a+b); } export {add} ;

index.js:

import {add} from './utiles/utiles.js' add(6,9);

1.4 webpack打包:

終端輸入:webpack

webpack會自動尋找src目錄,然后尋找index.js入口文件,然后進(jìn)行打包,最終生成一個dist目錄為打包后內(nèi)容。

index.html引入:

 <script src="../dist/main.js"></script>

結(jié)果:

二.基本使用:

2.1.配置文件:

可以在配置文件里定義配置,表示你想如何打包,能設(shè)置很多條件。webpack會根據(jù)你配置文件的配置規(guī)則來進(jìn)行打包。在src同級目錄下新建一個webpack.config.js文件,里面寫配置信息。

如最基本的入口和出口:

const path = require('path'); module.exports = {   //打包入口文件路徑   entry: './src/index.js',   //path打包出口路徑,filename寫打包后文件名   output: {     path: path.resolve(__dirname, 'dist'),     filename: 'build.js',   }, };

終端輸入webpack后成功打包了build.js文件,跟上面打包的main.js內(nèi)容一樣:

2.2.loader:

為什么使用loader:

webpack 只能理解 JavaScript 和 JSON 文件,這是 webpack 開箱可用的自帶能力。loader 能讓 webpack 能夠去處理其他類型的文件(比如css類型文件,圖片類型,txt類型等等),并將它們轉(zhuǎn)換為有效模塊,以供使用。

2.2.1 css-loader:

比如,我想webpack能打包c(diǎn)ss,終端輸入以下命令先安裝css-loader:

npm i css-loader -D

1.可以在導(dǎo)入css文件的時候指定loader,這樣就不報錯了,在導(dǎo)入css文件路徑前添加css-loader!:

import 'css-loader!./css/index.css'

2.當(dāng)然,也可以在配置文件設(shè)置:

const path = require('path'); module.exports = {   //打包入口文件路徑   entry: './src/index.js',   //path打包出口路徑,filename打包后文件名   output: {     path: path.resolve(__dirname, 'dist'),     filename: 'build.js',   },   //定義一些規(guī)則   module: {       //數(shù)組里每個元素為一個規(guī)則      rules:[         {             test: /\.css$/,             use: [                 {loader: 'css-loader'}             ]           //簡寫為 use: ['css-loader']             }      ]   } };

test 屬性,定義一個正則表達(dá)式,匹配需要處理的文件類型。識別出哪些文件會被轉(zhuǎn)換。
use 屬性,定義出在進(jìn)行轉(zhuǎn)換時,應(yīng)該使用哪個 loader。

配置文件里配置后,別忘了在index入口文件導(dǎo)入css文件。

2.2.2 style-loader:

上面css-loader只是能識別css文件,而引入了style-loader后css樣式才能在頁面展示。

安裝:

npm i style-loader -D

配置文件規(guī)則:

因為 webpack 是 從 后 往 前 執(zhí) 行 ,所以style-loader寫在css-loader前面。

module: {       //數(shù)組里每個元素為一個規(guī)則      rules:[         {             test: /\.css$/,             use: ['style-loader','css-loader']         }      ]   }

2.2.3 sass-loader:

比如,我想 webpack 能打包scss文件類型。不會sass的可以看這篇文章文章sass全解析。

安裝sass:

npm i sass -D

轉(zhuǎn)換scss為css(注意在scss同級路徑下轉(zhuǎn)換,也是終端輸入):

sass index.scss:ouput.css

在入口文件index.js導(dǎo)入:

import './css/ouput.css'

安裝sass-loader:

npm i sass-loader -D

配置規(guī)則:

 //定義一些規(guī)則   module: {       //數(shù)組里每個元素為一個規(guī)則      rules:[         {             test: /\.css$/,             use: ['style-loader','css-loader']         },          {             test: /\.scss$/,             use: ['style-loader','css-loader']         }      ]   }

打包:

webpack

2.3 browserslist:

Webpack 支持所有符合 ES5 標(biāo)準(zhǔn) 的瀏覽器(不支持 IE8 及以下版本)。如果你想要支持舊版本瀏覽器,那就需要借助到一些工具了。在安裝webpack時默認(rèn)安裝了browserslist,它可以知道各個瀏覽器的占有率數(shù)據(jù)并配置。

這個網(wǎng)站也可以查到目前各個瀏覽器的占有率數(shù)據(jù)。后面再詳細(xì)講。

2.4 postcss-loader處理css兼容:

postcss是JavaScript轉(zhuǎn)換樣式的工具,這個工具能處理css兼容問題。就是這個工具能給我們寫的css代碼添加一些兼容的前綴。

首先,你可以通過 這個網(wǎng)站 了解css是添加什么前綴怎么能兼容主流瀏覽器的。

安裝:

npm i postcss-loader -D npm i autoprefixer -D

配置文件:

在css文件類型里添加postcss-loader,并配置參數(shù) :

  {             test: /\.css$/,             use: [                 'style-loader',                 'css-loader',                 //添加postcss-loader                 {                     loader:'postcss-loader',                     //配置參數(shù)                     options:{                        postcssOptions:{                            //添加插件autoprefixer,能加前綴                            plugins:[                                require('autoprefixer')                            ]                        }                     }                 }             ]         },

在index.js同級下新建一個名為.browserslistrc 文件,里面寫兼容的條件,如:

> 0.1% last 2 version not dead

然后終端輸入webpack打包后css代碼會自動添加兼容代碼。

上面只是添加前綴,如果還需要更強(qiáng)的兼容需要 postcss-preset-env, 安裝:

npm i  postcss-preset-env -D

添加配置(來次全的):

const path = require('path'); module.exports = {   //打包入口文件路徑   entry: './src/index.js',   //path打包出口路徑,filename打包后文件名   output: {     path: path.resolve(__dirname, 'dist'),     filename: 'build.js',   },   //定義一些規(guī)則   module: {       //數(shù)組里每個元素為一個規(guī)則      rules:[         {             test: /\.css$/,             use: [                 'style-loader',                 'css-loader',                 //添加postcss-loader                 {                     loader:'postcss-loader',                     //配置參數(shù)                     options:{                        postcssOptions:{                            //添加插件autoprefixer,能加前綴                            plugins:[                                require('autoprefixer'),                                require('postcss-preset-env')                            ]                        }                     }                 }             ]         },          {             test: /\.scss$/,             use: ['style-loader','css-loader']         }      ]   } };

可以只保留postcss-preset-env,簡寫:

  {             test: /\.css$/,             use: [                 'style-loader',                 'css-loader',                 //添加postcss-loader                 {                     loader:'postcss-loader',                     //配置參數(shù)                     options:{                        postcssOptions:{                            //添加插件autoprefixer,能加前綴                            plugins:['postcss-preset-env']                        }                     }                 }             ]         },

不過一般是在index.js同級下新建一個postcss.config.js文件專門寫配置:

postcss.config.js文件內(nèi)容:

module.exports = {     plugins: [         require('postcss-preset-env')     ] }

然后在webpack.config.js配置文件里直接導(dǎo)入postcss-loader就行:

 use: [                 'style-loader',                 'css-loader',                 //添加postcss-loader                  'postcss-loader'             ]

2.5 importLoaders:

importLoaders:用于配置「css-loader 作用于 @import 的資源之前」有多少個 loader。直白來說就是importLoaders設(shè)置幾,那么通過@import 導(dǎo)入的css文件也會向前執(zhí)行前面不再執(zhí)行的loader。

如下:

 use: [                 'style-loader',                 {                    loader:'css-loader',                    options:{                        importLoaders:1                    }                 },                  'postcss-loader'             ]

本來一個css文件會執(zhí)行上面3個loader,如果那個css文件存在通過import語法導(dǎo)入的css文件,那么那個導(dǎo)入的css文件是不會執(zhí)行最后的postcss-loader。但是我想執(zhí)行,所以配置importLoaders,表示import導(dǎo)入的css文件也會向后執(zhí)行多少個loader。(注意webpack是從后往前執(zhí)行的)

2.6 file-loader處理圖片:

file-loader作用:

1.當(dāng)我們把圖片當(dāng)一個模塊導(dǎo)入的時候可以識別它。
2.可以把二進(jìn)制資源拷貝一份到指定目錄,沒指定就是默認(rèn)dist目錄。

安裝:

npm i file-loader -D 

2.6.1 在js里通過src導(dǎo)入的:

可以在src目錄下新建一個img文件夾存放圖片。

配置文件(在rules數(shù)組里繼續(xù)新增一個規(guī)則):

       {             test: /\.(png|svg|gif|jpe?g)$/,             use:['file-loader']         }
  • 第一種用法:
    當(dāng)把圖片當(dāng)成一個模塊導(dǎo)入時在末尾添加.default,比如如:

    var img = document.createElement('img');     img.src = require('../img/1.jpg').default;     document.body.appendChild(img);
  • 第二種用法:
    如果不想模塊導(dǎo)入時在末尾添加.default,那么在配置文件里添加參數(shù)esModule:

{             test: /\.(png|svg|gif|jpe?g)$/,             use:{                 loader:'file-loader',                 options: {                     esModule:false                 }             }         }
  • 第三種用法:
    如果你也不想上面這樣寫,還可以通過es6模塊導(dǎo)入方式:

先導(dǎo)入圖片模塊:

import src from '../img/1.jpg';

然后再:

   var img = document.createElement('img');    img.src = src;    document.body.appendChild(img);

最后終端webpack打包就行,目前會將圖片默認(rèn)打包到dist目錄。

2.6.2 在css里通過url導(dǎo)入的:

跟上面src區(qū)別就是要修改的是css類型文件規(guī)則,加一個esModule參數(shù):

{             test: /\.css$/,             use: [                 'style-loader',                 {                    loader:'css-loader',                    options:{                        importLoaders:1,                        esModule:false                    }                 },                  'postcss-loader'             ]         },           {             test: /\.(png|svg|gif|jpe?g)$/,             use: ['file-loader']         }

然后在css里通過url正常引用即可,webpack打包后會將圖片默認(rèn)打包到dist目錄:

div {   width: 200px;   height: 200px;   background-image: url("../img/1.jpg"); }

默認(rèn)位置,如(圖片名稱自動根據(jù)內(nèi)容算法得出):

2.6.3 設(shè)置輸出位置與圖片名稱:

我們可以設(shè)置打包后的圖片存放到的地方與名稱。

修改配置文件的圖片規(guī)則,添加一個name配置(名稱)屬性和outputpath屬性(位置):

 {             test: /\.(png|svg|gif|jpe?g)$/,             use: {                 loader:'file-loader',                 options:{                     name: '[name].[hash:6].[ext]',                     outputPath: 'img'                 }             }         }

其中name屬性里表示:【ext】擴(kuò)展名,【name】文件名,【hash】文件內(nèi)容。outputpath屬性:直接指定img目錄,默認(rèn)會放在dist目錄下。

兩個屬性可以合并直接簡寫為:

 {             test: /\.(png|svg|gif|jpe?g)$/,             use: {                 loader:'file-loader',                 options:{                     name: 'img/[name].[hash:6].[ext]',                 }             }         }

2.7 url-loader處理圖片:

url-loader可以將圖片轉(zhuǎn)為base64字符串,能更快的加載圖片(適用圖片文件較少情況,過大的話還是用file-loader)。file-loader相對于拷貝,速度較慢。

安裝:

npm i url-loader -D

配置其實(shí)跟file-loader差不多的,把loader那一改就行:

{             test: /\.(png|svg|gif|jpe?g)$/,             use: {                 loader:'url-loader',                 options:{                     name: 'img/[name].[hash:6].[ext]',                 }             }         }

與file-loader不同的是,打包后圖片會以base64字符串形式加載到代碼里,所以目錄里不再可見:

關(guān)鍵的是,其實(shí) url-loader 包含 file-loader ,可以設(shè)置一個 limit 屬性,當(dāng)圖片大小超過limit,url-loader會自認(rèn)不行,會主動去調(diào)用file-loader去執(zhí)行。

如下:設(shè)置一個筏值20kb,小于它會執(zhí)行url-loader,大于它會執(zhí)行file-loader

 {             test: /\.(png|svg|gif|jpe?g)$/,             use: {                 loader:'url-loader',                 options:{                     name: 'img/[name].[hash:6].[ext]',                     limit: 20*1024                 }             }         }

2.8 asset處理圖片:

webpack5之后可以直接使用asset處理圖片,不必再配置file-loader或url-loader。能更好的簡化使用。且它是webpack5內(nèi)置模塊,不必額外進(jìn)行安裝其它東西。

配置文件修改圖片規(guī)則:

1、默認(rèn)情況,拷貝圖片,默認(rèn)放到dist目錄下(跟file-loader沒配置名稱和路徑時結(jié)果一樣):

 {             test: /\.(png|svg|gif|jpe?g)$/,             type: 'asset/resource'         }

2、指定圖片打包后位置,放到dist下的img文件夾里,圖片規(guī)則跟上面一樣,要修改的是output打包出口路徑那里,新增assetModuleFilename:

//path打包出口路徑,filename打包后文件名   output: {     path: path.resolve(__dirname, 'dist'),     filename: 'build.js',     assetModuleFilename:'img/[name].[hash:6][ext]'   },     {             test: /\.(png|svg|gif|jpe?g)$/,             type: 'asset/resource'         }

3、上面相當(dāng)于全局配置,不論什么圖片都會執(zhí)行,所以不大好,所以還是在規(guī)則里面加圖片輸出位置與名稱好點(diǎn),新增generator,里面的filename寫位置與名稱:

 {             test: /\.(png|svg|gif|jpe?g)$/,             type: 'asset/resource',             generator:{                 filename:'img/[name].[hash:6][ext]'             }         }

4、如果想將圖片轉(zhuǎn)為base64字符串,而不是拷貝的話,修改規(guī)則如下:

    {         test: /\.(png|svg|gif|jpe?g)$/,         type: 'asset/inline',     }  

5、當(dāng)然,也能像url-loader設(shè)置limit那樣設(shè)置一個閥值,超過后還是用拷貝,修改規(guī)則如下,maxSize設(shè)置大小,這里閥值為30kb大小:

     {             test: /\.(png|svg|gif|jpe?g)$/,             type: 'asset',             generator:{                 filename:'img/[name].[hash:6][ext]'             },             parser:{                 dataUrlCondition: {                     maxSize: 30*1024                 }             }         }

2.9 asset處理字體圖標(biāo):

新增如下規(guī)則:

 // 字體圖標(biāo)         {             test: /\.(ttf|woff2?)$/,             type:'asset/resource',             generator:{                 filename:'font/[name].[hash:3][ext]'             },         }

2.10 webpack插件使用:

眾所周知,插件能幫助我們更方便的做更多的事情。

2.10.1 dist目錄自動清空插件:

每次我們重新webpack打包的時候還要把上次打包的dist目錄刪除掉,麻煩,所以這里下載一個dist目錄自動清空插件。以后打包會默認(rèn)把上次打包內(nèi)容清空后打包。

安裝clean-webpack-plugin插件:

npm i clean-webpack-plugin -D

設(shè)置配置文件的配置項plugins:

const path = require('path'); // 1.先導(dǎo)入下載的插件 const {CleanWebpackPlugin} = require('clean-webpack-plugin'); module.exports = {   entry: './src/index.js',   output: {     path: path.resolve(__dirname, 'dist'),     filename: 'build.js',   },   module: {。。。},   //2.定義插件配置的屬性 plugins ,存放每個插件   plugins: [       //3.每個插件都是一個類,直接new就行       new CleanWebpackPlugin()   ] };

每個插件都是一個類,直接new就行,可以查看對應(yīng)插件的官網(wǎng),了解傳的參數(shù)對應(yīng)什么功能。

2.10.2 html-webpack-plugin插件:

能幫我們打包后在打包目錄里生成一個html文件模板,并引用入口文件。

安裝html-webpack-plugin插件:

npm i html-webpack-plugin -D

設(shè)置配置文件的配置項plugins:

const path = require('path'); const {CleanWebpackPlugin} = require('clean-webpack-plugin'); // 1.先導(dǎo)入下載的插件 const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = {   entry: './src/index.js',   output: {     path: path.resolve(__dirname, 'dist'),     filename: 'build.js',   },   module: {。。。},   plugins: [       new CleanWebpackPlugin(),     // 2.添加      new HtmlWebpackPlugin()   ] };

webpack打包后:

html默認(rèn)內(nèi)容:

<!DOCTYPE html> <html>   <head>     <meta charset="utf-8" />     <title>Webpack App</title>     <meta name="viewport" content="width=device-width,initial-scale=1" />     <script defer="defer" src="build.js"></script>   </head>   <body></body> </html>

對于html很多地方可以設(shè)置的,比如title的內(nèi)容啥的,在配置文件new的時候傳遞對應(yīng)參數(shù)就行(具體參考該插件官網(wǎng)):

。。。略 plugins: [       new CleanWebpackPlugin(),       new HtmlWebpackPlugin({           title:'北極光之夜。'       })   ]

打包后生成的html文件內(nèi)容:

<!DOCTYPE html> <html>   <head>     <meta charset="utf-8" />     <title>北極光之夜。</title>     <meta name="viewport" content="width=device-width,initial-scale=1" />     <script defer="defer" src="build.js"></script>   </head>   <body></body> </html>

當(dāng)然,可以自己提供一個html模板,以我提供的模板為基礎(chǔ)生成新的html模板:

1、在src同級下新建一個public目錄,在里面新建一個index.html文件作為模板:

2、比如index.html內(nèi)容如下:

<!DOCTYPE html> <html>   <head>     <meta charset="UTF-8" />     <meta http-equiv="X-UA-Compatible" content="IE=edge" />     <meta name="viewport" content="width=device-width, initial-scale=1.0" />     <title><%= htmlWebpackPlugin.options.title %></title>   </head>   <body>     <div id="app">test</div>   </body> </html>

<%= htmlWebpackPlugin.options.title %>表示使用配置里的title。

3、新增template參數(shù),值為模板路徑:

  new HtmlWebpackPlugin({           title:'北極光之夜。',           template:'./public/index.html'       })

4、打包結(jié)果:

2.11 babel-loader處理js兼容:

能處理js兼容問題,比如兼容es6語法。

安裝:

npm i @babel/core -D npm i babel-loader -D

在index.js同級下新建一個babel.config.js文件專門寫配置:

babel.config.js文件內(nèi)容:

 module.exports = {     presets: ['@babel/preset-env'] }

然后在webpack.config.js配置文件里新增規(guī)則:

        {             test:/\.js$/,             use:['babel-loader']         }

跟在前面說到的postcss-loader一樣,同樣在.browserslistrc 文件里面寫兼容的條件,如:

0.1%
last 2 version
not dead

最后webpack打包就行了。

2.12 polyfill處理js兼容:

babel-loader處理的js兼容還不夠多,只能處理簡單的,若存在promise這些新語法也不大行。所以需要polyfill。

安裝:

npm i @babel/polyfill --save

修改babel.config.js:

module.exports = {     presets: [         '@babel/preset-env',         {             useBuiltIns: 'entry',             crorejs: 3         }     ] }

2.13 自動更新:

可以實(shí)現(xiàn)你修改源碼后,打包后的代碼也自動更新,不用每次都手動打包去更新。

1、不使用webpack-dev-serve之前,可以在配置文件添加watch屬性為true也能實(shí)現(xiàn)自動更新,但是性能不太好,不能局部更新,是一有更新就全都更新:

如:

module.exports = { //  這里,自動更新     watch: true,   //打包入口文件路徑   entry: './src/index.js',   //path打包出口路徑,filename打包后文件名   output: {     path: path.resolve(__dirname, 'dist'),     filename: 'build.js',     //assetModuleFilename:'img/[name].[hash:6][ext]'   },   。。。略 }  

2、webpack-dev-serve性能較好,能實(shí)現(xiàn)局部更新,節(jié)省性能。

在終端先安裝:

npm install webpack-dev-server --save-dev

以后打包命令改為:

webpack serve

2.14 HMR模塊熱替換:

作用:一個模塊發(fā)生變化,只會重新打包這一個模塊(而不是打包所有模塊),極大的提升構(gòu)建速度。

先配置:

module.exports = {   target: 'web',   // 開啟HMR   devServer:{       hot: true   }   。。。 }

然后在入口文件處通過判斷給需要熱更新的模塊熱更新:

import './title' if(module.hot){   module.not.accept(['./title.js']) }

2.15 output的path:

output有一個publicPath屬性,為項目中引用 css,js,img 等資源時候的一個基礎(chǔ)路徑。其輸出解析文件的目錄,指定資源文件引用的目錄 ,打包后瀏覽器訪問服務(wù)時的 url 路徑中通用的一部分。

 output: {     path: path.resolve(__dirname, 'dist'),     filename: 'build.js',     publicPath:''   },

2.16 devServer常用配置:

 devServer:{       hot: true       hotOnly:true,       //默認(rèn)端口       port:4000       //自動打開瀏覽器       open:false       //開啟服務(wù)端壓縮       compress: true       //使用 History 路由模式時,若404錯誤時被替代為 index.html       historyApiFallback: true   } 

2.17 proxy代理:

通過webpack設(shè)置代理解決瀏覽器跨域問題。在 devServer 下添加一個 proxy 屬性:

devServer:{     ....       proxy: {         //定義一個標(biāo)記,如以后api開頭的請求都走代理的設(shè)置           '/api': {              // 要請求的真實(shí)服務(wù)端基地址 相當(dāng)于被/api替代了              target: 'https://...',             //把a(bǔ)pi重寫為空,因為別人沒有 /api              pathRewrite: {"^/api":""},              //發(fā)送請求頭中host會設(shè)置成target              changeOrigin: true           }       }   } 

此時,如果我們原本想請求的服務(wù)端地址為 https://… /user 就可以替換成 /api/user , 然后把/api重寫為空,那么實(shí)際上就是相當(dāng)于寫了 https://… /user, 如:

axios.get('/api/user').then(res=>{...})

2.18 mode模式:

提供 mode 配置選項,告知 webpack 使用相應(yīng)模式的一些內(nèi)置優(yōu)化。如果沒有設(shè)置,webpack 會給 mode 的默認(rèn)值設(shè)置為 production。

string = 'production': 'none' | 'development' | 'production' module.exports = {   mode: 'development', };

2.19 打包vue文件:

1.安裝:

$ cnpm i vue-loader vue-template-compiler -D

2.添加規(guī)則:

   {             test:/\.vue$/,             use:['vue-loader']         }

3.導(dǎo)入插件并使用:

const VueLoaderPlugin = require('vue-loader/lib/plugin');

未完結(jié),持續(xù)更新中。。。


該文章在 2024/4/3 11:13:55 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊、財務(wù)費(fèi)用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved