WebPack 学习:从阮神的15个DEMO开始
WebPack 是什么
官方就一句话,打包所有的资源。
从阮神的 15 DEOM入手 Webpack
Github 地址
阮神GIT
按照 ReadME 操作
- npm webpack-dev-server ,为了能够运行起来demo的代码
- cd 到任何一个demo下,执行npm run dev 即可运行demo
npm run dev 是在 demo下的package.json文件中 配置的 script,实际上是在执行 webpack-dev-server --open
对DEMO拆解
- 准备工作:
- 请保证电脑上有npm
- 创建一个文件夹 webpack-tutorial
- cmd cd到上面的文件夹,键入 npm init 根据提示步骤创建package.json文件,可以一直enter
- npm install webpack webpack-cli webpack-dev-server 安装需要的包
demo1 :单个入口
- 创建 webpack.config.js文件,代码如下
module.exports = {entry: './main.js',//入口文件是当前目录下的 main.js文件output: {filename: 'bundle.js'//打包后的文件名称是 bundle.js//这里webpack会自动创建dist文件夹,将bundle.js放到里面。//这里的./会指定到 dist下//比如 filename:'./js/bundle.js' 会在dist下找js文件夹放入bundle.js文件//可以通过path指定不同的目录} };
- 创建 main.js文件 ,代码如下:
// main.js document.write('<h1>Hello World</h1>');//往页面上写hello world
- CMD中键入 webpack进行打包,键入进行开启
//webpack 输出 Asset Size Chunks Chunk Names bundle.js 968 bytes 0 [emitted] main Entrypoint main = bundle.js
webpack-dev-server --open //打开浏览器后发现是一个ftp的页面//我们下面将自动创建index.html文件
- CMD 键入
npm install html-webpack-plugin//安装自动生成html插件
- 重新编辑 webpack.config.js
var HtmlwebpackPlugin = require('html-webpack-plugin'); module.exports = {entry: './main.js',//入口文件是当前目录下的 main.js文件output: {filename: 'bundle.js'//打包后的文件名称是 bundle.js//这里webpack会自动创建dist文件夹,将bundle.js放到里面。//这里的./会指定到 dist下//比如 filename:'./js/bundle.js' 会在dist下找js文件夹放入bundle.js文件//可以通过path指定不同的目录},//加入html自动生成plugins:[new HtmlwebpackPlugin({title: 'Webpack-tutorial',filename: 'index.html'}), ] };
- 重新CMD 键入 webpack 打包 ,键入 webpack-dev-server --open 开启server
//webpack输出 Asset Size Chunks Chunk Namesbundle.js 968 bytes 0 [emitted] main index.html 187 bytes [emitted] Entrypoint main = bundle.js
会发现 dist 文件夹下自动生成了 index.html并且引入 打包好的 bundle.js文件,浏览器正常显示一个h1的hello world
demo2 :两个入口
- 更改 webpack.config.js 文件如下:
var HtmlwebpackPlugin = require('html-webpack-plugin'); module.exports = {entry: {bundle1: './main1.js',//入口1 main1.jsbundle2: './main2.js'//入口2 main2.js},output: {filename: '[name].js'//name是entry的键名,最后会生成bundle1.js bundle2.js},//加入html自动生成plugins:[new HtmlwebpackPlugin({title: 'Webpack-tutorial',filename: 'index.html'}), ] };
- 分别创建 main1.js 与main2.js
// main1.js document.write('<h1>Hello World</h1>'); // main2.js document.write('<h2>Hello Webpack</h2>');
- CMD 键入 webpack 打包 ,键入 webpack-dev-server --open 开启server
//webpack 输出Asset Size Chunks Chunk Names bundle1.js 968 bytes 0 [emitted] bundle1 bundle2.js 971 bytes 1 [emitted] bundle2 index.html 245 bytes [emitted] Entrypoint bundle1 = bundle1.js Entrypoint bundle2 = bundle2.js [0] ./main1.js 39 bytes {0} [built] [1] ./main2.js 41 bytes {1} [built]
会在dist下 创建 bundle1.js/bundle2.js/index.html,浏览器会有h1的helloworld h2的hellowebpack
demo3 :Babel-loader 的使用
什么loaders:就是webpack使用loaders来预处理文件,允许打包除了js文件外任何静态资源。
什么是Babel-loader:是javascript编译器,将现行的javascript代码变成浏览器可以兼容的代码。
- 例子中是 react 所有我们先安装下相关的包
npm install react react-dom//js 用到 npm install babel-loader babel-core babel-preset-es2015 babel-preset-react //这里说明一下 babel-loader单独安装一下7.1.5的版本,因为最新的8版本 打包时会报错
- 创建main.jsx文件
// main.jsx //我们需要增加一部分代码 //增加一个创建wrapper div的过程 //这边我的index.html是自动创建的,打包后在更改 会报错 //不知道阮神是怎么弄的,等我研究明白了再回来说明一下 //如下方法可成功显示 var div = document.createElement('div'); div.id = 'wrapper'; document.body.appendChild(div); //结束 const React = require('react'); const ReactDOM = require('react-dom'); ReactDOM.render(<h1>Hello, world!</h1>,document.querySelector('#wrapper')//将h1这个标签放到 id是wrapper的div中 );
- 修改webpack.config.js文件
var HtmlwebpackPlugin = require('html-webpack-plugin'); module.exports = {entry: './main.jsx',//不说明了output: {filename: 'bundle.js'},//加入html自动生成plugins:[new HtmlwebpackPlugin({title: 'Webpack-tutorial',filename: 'index.html'}), ],module: {rules: [{test: /\.jsx?$/,//匹配.jsx文件exclude: /node_modules/,//不包含这个文件夹 npm包use: {loader: 'babel-loader',//使用babel-loader这个options: {presets: ['es2015', 'react']//使用 es2015 跟react//这里说明一下,这里的顺序是从右到左加载的,即,先用react再用es2015}}}]} };
- CMD 键入 webpack 打包 ,键入 webpack-dev-server --open 开启server
//webpack 输出Asset Size Chunks Chunk Namesbundle.js 248 KiB 0 [emitted] [big] main index.html 187 bytes [emitted]
demo4 :css-loader使用
- cmd 键入
npm install css-loader style-loader
- 创建 app.css文件
body {background-color: blue; }
- 更改 webpack.config.js,增加一个css-loader
var HtmlwebpackPlugin = require('html-webpack-plugin'); module.exports = {entry: './main.js',output: {filename: 'bundle.js'},//加入html自动生成plugins:[new HtmlwebpackPlugin({title: 'Webpack-tutorial',filename: 'index.html'}), ],module: {rules: [{test: /\.jsx?$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['es2015', 'react']}}},{test: /\.css$/,use: [ 'style-loader', 'css-loader' ]//同样的 从右到左加载},]} };
- 更改main.js文件
require('./app.css');
- CMD 键入 webpack 打包 ,键入 webpack-dev-server --open 开启server
//webpack 输出Asset Size Chunks Chunk Namesbundle.js 147 KiB 0 [emitted] main index.html 187 bytes [emitted]
demo5 :image loader
不做赘述,需要 npm url-loader。与上一个demo类似
- demo6 : CSS Module
Css Module:给CSS加入了局部作用域和模块依赖。详情还是请看阮神博客。还有官网。
本次demo 只是介绍了局部作用于与全局作用域。
- 更改main.jsx文件。同样我们增加一部分代码。
//增加start var div = document.createElement('div'); div.id = 'example'; document.body.appendChild(div);var h1 = document.createElement('h1'); h1.className="h1"; var t1=document.createTextNode("Hello World"); h1.appendChild(t1); document.body.appendChild(h1);var h2 = document.createElement('h2'); h2.className="h2"; var t2=document.createTextNode("Hello Webpack"); h2.appendChild(t2); document.body.appendChild(h2); //end var React = require('react'); var ReactDOM = require('react-dom'); var style = require('./app.css');ReactDOM.render(<div><h1 className={style.h1}>Hello World</h1><h2 className="h2">Hello Webpack</h2></div>,document.getElementById('example') );
- 更改webpack.config.js
var HtmlwebpackPlugin = require('html-webpack-plugin'); module.exports = {entry: './main.jsx',//每次看好打包的入口文件呦output: {filename: 'bundle.js'},//加入html自动生成plugins:[new HtmlwebpackPlugin({title: 'Webpack-tutorial',filename: 'index.html'}), ],module: {rules: [{test: /\.jsx?$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['es2015', 'react']}}},{test: /\.css$/,use: [{loader: 'style-loader'},{//使用moduleloader: 'css-loader',options: {modules: true}}]}]} };
- 更改app.css
/* local scope */ .h1 {color:red; }/* global scope */ :global(.h2) {color: blue; }
- CMD 键入 webpack 打包 ,键入 webpack-dev-server --open 开启server
Asset Size Chunks Chunk Namesbundle.js 6.89 KiB 0 [emitted] main index.html 187 bytes [emitted]
- 结果是 有一个红色字体的h1 一个黑色字体的h1 两个蓝色字体的h2, 因为h2 的class是global的 h1的local的
- demo7:使用 uglifyjs 插件
什么事uglifyjs 插件:将输出的文件bundle.js变到最小。丑化js代码。
这里需要注意webpack 两种模式的 产品模式下 uglifyjs插件是默认开启的我们需要在development模式下搞
- 更改main.js使用阮神demo中的代码:
var longVariableName = 'Hello'; longVariableName += ' World'; document.write('<h1>' + longVariableName + '</h1>');
- 在webpack.config.js文件中加入如下配置:
mode: 'development',//开发者模式
- 我们先打包一次main.js打包成的bundle.js的大小为3.89kb,然后使用插件。这个时候bundle.js可读
- npm install uglifyjs-webpack-plugin,更改webpack.config.js,加一个插件其他不更改
var HtmlwebpackPlugin = require('html-webpack-plugin'); var UglifyJsPlugin = require('uglifyjs-webpack-plugin');module.exports = {entry: './main.js',//每次看好打包的入口文件呦output: {filename: 'bundle.js'},//加入html自动生成mode: 'development',//开发者模式plugins:[new HtmlwebpackPlugin({title: 'Webpack-tutorial',filename: 'index.html'}), new UglifyJsPlugin(),//开发者模式下使用插件],module: {rules: [{test: /\.jsx?$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['es2015', 'react']}}},{test: /\.css$/,use: [{loader: 'style-loader'},{loader: 'css-loader',options: {modules: true}}]}]} };
- CMD 键入 webpack 打包 ,查看bundle.js大小1.23KB
- demo8 :html-webpack-plugin与open-browser-webpack-plugin两个插件。
html-webpack-plugin:自动生成html插件。这个插件我们已经使用啦,不介绍了。
open-browser-webpack-plugin:自动打开浏览器插件。
- npm install open-browser-webpack-plugin,更改webpack.config.js如下
var HtmlwebpackPlugin = require('html-webpack-plugin'); var UglifyJsPlugin = require('uglifyjs-webpack-plugin'); var OpenBrowserPlugin = require('open-browser-webpack-plugin'); module.exports = {entry: './main.js',//每次看好打包的入口文件呦output: {filename: 'bundle.js'},mode: 'development',//加入html自动生成plugins:[new HtmlwebpackPlugin({title: 'Webpack-tutorial',filename: 'index.html'}), new UglifyJsPlugin(),new OpenBrowserPlugin({url: 'http://localhost:8080'//开启服务后自动打开这个网址})],module: {rules: [{test: /\.jsx?$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['es2015', 'react']}}},{test: /\.css$/,use: [{loader: 'style-loader'},{loader: 'css-loader',options: {modules: true}}]}]} };
- CMD 键入 webpack 打包 ,键入 webpack-dev-server 开启server,不需要--open了 否则会打开两个页面
- demo9 :Environment flags
在开发时,有些东西要放出来,产品环境时需要屏蔽掉。我们可以定一个变量去看当前的模式。
- 更改main.js
document.write('<h1>Hello World</h1>');if (__DEV__) {//__DEV__ 在webpack.config.js中定义document.write(new Date()); }
- webpack.config.js
var HtmlwebpackPlugin = require('html-webpack-plugin'); var UglifyJsPlugin = require('uglifyjs-webpack-plugin'); var OpenBrowserPlugin = require('open-browser-webpack-plugin');var devFlagPlugin = new webpack.DefinePlugin({__DEV__: JSON.stringify(JSON.parse(process.env.DEBUG || 'false')) });module.exports = {entry: './main.js',//每次看好打包的入口文件呦output: {filename: 'bundle.js'},mode: 'development',//加入html自动生成plugins:[new HtmlwebpackPlugin({title: 'Webpack-tutorial',filename: 'index.html'}), new UglifyJsPlugin(),new OpenBrowserPlugin({url: 'http://localhost:8080'}),devFlagPlugin,],module: {rules: [{test: /\.jsx?$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['es2015', 'react']}}},{test: /\.css$/,use: [{loader: 'style-loader'},{loader: 'css-loader',options: {modules: true}}]}]} };
- webpack 打包,并输入cross-env DEBUG=true webpack-dev-server,来控制debug
阮神是想通过命令将当前是否是debug传入到程序中,我们更改一下代码。官网上介绍可以使用process.env.NODE_ENV来访问当前的mode。
- main.js
document.write('<h1>Hello World</h1>');if (process.env.NODE_ENV=="development") {document.write(new Date()); }
- 直接看页面。注:更改了config文件需要重新打包其他的不需要。
demo10 :code splitting
code splitting:打包时,分文件打包
- main.js
// main.js require.ensure(['./a'], function (require) {var content = require('./a');document.open();document.write('<h1>' + content + '</h1>');document.close(); });
- 创建a.js
// a.js module.exports = 'Hello World';
- 其他不变,直接webpack打包,多生成了0.bundle.js文件
//wepack 输出Asset Size Chunks Chunk Names 0.bundle.js 307 bytes 0 [emitted]bundle.js 2.45 KiB main [emitted] mainindex.html 187 bytes [emitted]
demo 11:Code splitting with bundle-loader
- 这个与demo10 一样,npm install bundle-loader后直接更改 main.js
// main.js// Now a.js is requested, it will be bundled into another file var load = require('bundle-loader!./a.js');// To wait until a.js is available (and get the exports) // you need to async wait for it. load(function(file) {document.open();document.write('<h1>' + file + '</h1>');document.close(); });
- 直接webpack打包:效果是相同的
Asset Size Chunks Chunk Names 0.bundle.js 307 bytes 0 [emitted]bundle.js 2.45 KiB main [emitted] mainindex.html 187 bytes [emitted]
demo12:Common chunk
是自动将相同代码打包成一个common.js
- 这里需要说明,阮神的做法在webpack4中已经废弃了,现在可以直接使用,更改webpack.config.js
var HtmlwebpackPlugin = require('html-webpack-plugin'); var UglifyJsPlugin = require('uglifyjs-webpack-plugin'); var OpenBrowserPlugin = require('open-browser-webpack-plugin'); var webpack = require('webpack'); var devFlagPlugin = new webpack.DefinePlugin({__DEV__: JSON.stringify(JSON.parse(process.env.NODE_ENV || 'false')) });module.exports = {entry: {bundle1: './main1.jsx',bundle2: './main2.jsx'},output: {filename: '[name].js'},mode: 'development',//增加了这个配置即可optimization: {splitChunks: { // old CommonsChunkPluginchunks: "all"},},//加入html自动生成plugins:[new HtmlwebpackPlugin({title: 'Webpack-tutorial',filename: 'index.html'}), //new UglifyJsPlugin(),//我们想看打包后的文件,注释掉这个new OpenBrowserPlugin({url: 'http://localhost:8080'}),devFlagPlugin,],module: {rules: [{test: /\.jsx?$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['es2015', 'react']}}},{test: /\.css$/,use: [{loader: 'style-loader'},{loader: 'css-loader',options: {modules: true}}]}]} };
- 创建main1.jsx main2.jsx
// main1.jsx var React = require('react'); var ReactDOM = require('react-dom');ReactDOM.render(<h1>Hello World</h1>,document.getElementById('a') );// main2.jsx var React = require('react'); var ReactDOM = require('react-dom');ReactDOM.render(<h2>Hello Webpack</h2>,document.getElementById('b') );
- 直接webpack打包,会多一个vendors~bundle1~bundle2.js文件,
Asset Size Chunks Chunk Namesbundle1.js 6.72 KiB bundle1 [emitted] bundle1bundle2.js 6.72 KiB bundle2 [emitted] bundle2index.html 318 bytes [emitted] vendors~bundle1~bundle2.js 832 KiB vendors~bundle1~bundle2 [emitted] vendors~bundle1~bundle2
- demo13 :vendor chunk
作用:将某一部分类库,打包到vendor js中。需要先 npm install jquery
- main.js
var $ = require('jquery'); $('h1').text('Hello World');
- webpack .config.js
var HtmlwebpackPlugin = require('html-webpack-plugin'); var UglifyJsPlugin = require('uglifyjs-webpack-plugin'); var OpenBrowserPlugin = require('open-browser-webpack-plugin'); var webpack = require('webpack'); var devFlagPlugin = new webpack.DefinePlugin({__DEV__: JSON.stringify(JSON.parse(process.env.NODE_ENV || 'false')) });module.exports = {entry: {app: './main.js',vendor: ['jquery'],},//每次看好打包的入口文件呦output: {filename: '[name].js'},mode: 'development',optimization: {splitChunks: { // old CommonsChunkPluginchunks: "all"},},//加入html自动生成plugins:[new HtmlwebpackPlugin({title: 'Webpack-tutorial',filename: 'index.html'}), //new UglifyJsPlugin(),new OpenBrowserPlugin({url: 'http://localhost:8080'}),devFlagPlugin,],module: {rules: [{test: /\.jsx?$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['es2015', 'react']}}},{test: /\.css$/,use: [{loader: 'style-loader'},{loader: 'css-loader',options: {modules: true}}]}]} };
- webpack 打包
# webpack 输出Asset Size Chunks Chunk Names0.js 552 bytes 0 [emitted]app.js 9.39 KiB app [emitted] app index.html 240 bytes [emitted]vendor.js 305 KiB vendor [emitted] vendor
- 说明下,阮神还是用的CommonsChunkPlugin,但是webpack4已经废弃了,其实本例的最后完成方法就类似于两个入口文件了,只不过其中一个的意思是所有的jquery包,打包到vendor.js中
- 这个例子最后阮神还介绍了一种不需要一直require包的方法
- webpack.config.js
var HtmlwebpackPlugin = require('html-webpack-plugin'); var UglifyJsPlugin = require('uglifyjs-webpack-plugin'); var OpenBrowserPlugin = require('open-browser-webpack-plugin'); var webpack = require('webpack'); var devFlagPlugin = new webpack.DefinePlugin({__DEV__: JSON.stringify(JSON.parse(process.env.NODE_ENV || 'false')) });module.exports = {entry: {app: './main.js',vendor: ['jquery'],},//每次看好打包的入口文件呦output: {filename: '[name].js'},mode: 'development',optimization: {splitChunks: { name (module) {// generate a chunk name...return; //...}},},//加入html自动生成plugins:[new HtmlwebpackPlugin({title: 'Webpack-tutorial',filename: 'index.html'}), //new UglifyJsPlugin(),new OpenBrowserPlugin({url: 'http://localhost:8080'}),devFlagPlugin,//增加定义$ jquery 随时可以使用new webpack.ProvidePlugin({$: 'jquery',jQuery: 'jquery'})],module: {rules: [{test: /\.jsx?$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['es2015', 'react']}}},{test: /\.css$/,use: [{loader: 'style-loader'},{loader: 'css-loader',options: {modules: true}}]}]} };
- 删除掉main.js中的 ,会发现 var $ = require('jquery');正常使用
- demo14:Exposing global variables
作用:定义一些全局变量,并在代码中使用它。
- 创建文件 data.js
var data = 'Hello World';//定义全局变量
- 更改 main.jsx 文件
// main.jsx var data = require('data'); var React = require('react'); var ReactDOM = require('react-dom');ReactDOM.render(<h1>{data}</h1>,document.body );
- webpack.config.js 文件
//增加如下配置externals: {// require('data') is external and available// on the global var data'data': 'data'}
- webpack打包
# webpack 输出Asset Size Chunks Chunk Names app.js 837 KiB app [emitted] app Entrypoint app = app.js [./main.js] 189 bytes {app} [built] [./node_modules/webpack/buildin/global.js] (webpack)/buildin/global.js 472 bytes {app} [built] [data] external "data" 42 bytes {app} [built] # 可以看到external data 这个变量可以require后使用了
- 不知到为什么,我使用html-webpack-plugin创建index.html后 不好使,而我在dist同级目录下创建一个index.html放入如下代码:打包开启server后,就能够正常显示data的数据了,最后也没弄清楚。
<html><body><script src="data.js"></script><script src="app.js"></script></body> </html>
- demo 15:React router
关于这段react 留着以后再研究。
总结
至此阮神的15DEMO演示完毕,本人也是先从官网看的文档,看的很迷糊,一些概念性的东西,完全没头没脑的看,通过一些简单的配置,可以对webpack有一个更好地理解。
转载于:https://www.cnblogs.com/primadonna/p/10082867.html
WebPack 学习:从阮神的15个DEMO开始相关推荐
- 【深度学习】利用神网框架分割病理切片中的癌组织(胃)
[深度学习]利用神网框架分割病理切片中的癌组织(胃) 文章目录 1 数据描述 2 思路 3 准备数据 4 构建模型 5 模型优化 6 程序执行 7 观察结果 1 数据描述 初赛选取癌病理切片,为常规 ...
- webpack学习之路
webpack学习之路 当自己在学习webpack的时候,在网上发现中文的很详细的教程很少,于是便想将自己学习webpack的笔记记录整理下来,便有了这篇文章,希望对大家有所帮助,如果有错误,欢迎大家 ...
- webpack学习笔记1
webpack学习笔记1:基本概念 前言: 现在在日常的开发中,webpack已经是必不可少的东西了,现在的需求基本都是用webpack对资源进行打包整合,所以打算写一点关于webpack的东西,这是 ...
- webpack学习(四) -- css tree shaking
css tree shaking 我们和webpack(三)一样,用案例说话 安装css需要的两个loader,css-loader 和style-loader npm install css-loa ...
- webpack学习之 style-loader / css-loader
继续我们上一篇的webpack学习,现在我们进一步学习 其他的配置 css-loader:用于让webpack加载这个css文件 安装:npm install css-loader -D / npm ...
- webpack学习之2.自动编译、实时重载LiveReload、热替换HMR
代码沿用webpack学习之1.基础配置 每次要编译代码时,手动运行 npm run build 就会变得很麻烦. webpack 中有几个不同的方式,可以在代码发生变化后自动编译代码: webpac ...
- webpack学习:性能优化
本文内容如下 性能优化相关内容 如果你都有了答案,可以忽略本文章,或去webpack学习导图寻找更多答案 性能优化两大方面 一,开发环境性能优化 优化: 构建速度,代码调试 HMR热模块更新(代码调试 ...
- 什么是loader? (webpack学习篇4)
什么是loader ? 官方把它定义为:用来将一段代码转换成另一段代码的webpack插件. 同时也给出了解释:虽然本质上说,loader也是插件,但因为webpack的体系中还有一个专门的名词就叫插 ...
- 【全栈之巅】Node.js + Vue.js 全栈开发王者荣耀手机端官网和管理后台学习笔记(3.13-3.15)
[全栈之巅]Node.js + Vue.js 全栈开发王者荣耀手机端官网和管理后台学习笔记(3.13-3.15) 本项目是 学习Bilibili 全栈之巅 视频教程相关源码和体会 https://gi ...
最新文章
- 面试官:说说RabbitMQ 消费端限流、TTL、死信队列
- IIS6.0 web.config
- 第四次作业 结对编程-黄金点游戏
- Java Web 前端高性能优化(二)
- java的集合:List、Set和Map
- android 图标的格式,Android Design
- C/C++内存分配与Linux内存管理进程所涉及到的五个数据段 .
- mesos marathon mysql_Mesos以及Marathon安装总结
- 括弧匹配检验(信息学奥赛一本通-T1354)
- CSS属性值之百分数
- java 内存泄漏问题_Java内存泄露的理解与解决(转)
- 一个常量,C#编译通过,打开Form报错
- FabFilter Pro-R 混响效果器
- idea中的maven项目的xml文件的xmlns报错的解决办法
- 对于多线程程序,单核cpu与多核cpu是怎么工作的
- android XML文件注释
- 手机重力感应控制电脑(一)
- Java基础 课后作业错题集
- 转售联通物联网卡的盈利可能性探讨
- Java求200内素数质数及其之和