最新要闻
- 陕西招聘会现3万月薪岗位学生排长龙 招聘人员:半天收简历150份
- 当前动态:供不应求!真我GT Neo5 1TB版真香:二手用户也抢着要
- “山药成了精”?男子买到奇葩山药外形酷似人脚掌
- 美少女三消游戏 《Mirror 2: Project X》开发组宣布破产解散
- 酒店回应到211大学招服务员:符合流程 面向所有高校毕业生
- 快看点丨京东CEO徐雷:百亿补贴效果超过预期、要做天天低价
- 【新要闻】比亚迪加入降价大军!宋Pro DM-i限时优惠:88元折扣6888元
- 焦点简讯:耳机煲机一般要煲多久_耳机煲机方法是什么?买回来新耳机要怎样煲?耳机要煲多久?
- 全球速看:浙四医院官网招聘2021_浙四医院官网
- 环球观点:京东2022年收入超1万亿:“百亿补贴”会一直有!
- 简约时尚 健身备一件:361°新款轻薄速干衣39元冲量
- 越来越卖不动了!最畅销十款数码相机一览:索尼成赢家 第一性价比绝
- 全球通讯!Intel的大小核CPU架构:最终还是把一些老游戏坑了
- 往返近1000元!景区回应坐滑竿上山按斤收费:网友力挺明码标价
- 前沿资讯!海洋风筝爆火 一周暴涨498%超过秋裤!网友:春天的信号
- 天天消息!甜香丝滑 旺旺邦德低脂轻乳咖啡官方狂促:合2元一瓶
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
初识rollup 打包、配置vue脚手架
rollup javascript 代码打包器,它使用了 es6 新标准代码模块格式。
特点:
- 面向未来,拥抱 es 新标准,支持标准化模块导入、导出等新语法。
- tree shaking 静态分析导入的代码。排除未实际引用的内容
- 兼容现有的 commonJS 模块,可通过插件导入
示例项目地址
(资料图片)
安装使用
创建示例项目
$> mkdir rollup-example$> cd rollup-example
安装 rollup
$> npm init -y$> npm i rollup
创建main.js
主入口文件。创建 libs
目录用于方式封装的功能函数。
在package.json
文件中定义执行脚本命令。
--file
编译后的文件名称 简写-o
--format
按什么标准去编译文件类型 iffe、cjs、es。 简写-f
{ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "rollup main.js --file bundle.js --format iife" }}
在libs
创建arry.js
/** * 数组类型校验 * @param {*} target * @returns */export const isArray = (target) => { return Array.isArray(target);};/** * 数组去重 * @param {*} target * @returns */export const duplicateKill = (target) => { return [...new Set(target)];};
然后在main.js
中调用
import { isArray } from "./libs/array";//console.log(isArray(3));console.log(isArray("1,2,3,4"));console.log(isArray([1, 2, 3, 4]));
执行npm run build
,得到一个编译文件bundle.js
(function () { "use strict"; /** * 数组类型校验 * @param {*} target * @returns */ const isArray = (target) => { return Array.isArray(target); }; // console.log(isArray(3)); console.log(isArray("1,2,3,4")); console.log(isArray([1, 2, 3, 4]));})();
通过配置文件定义编译配置
上面使用了rollup
命令,并通过命令行参数指定文件以及编译类型。
定义rollup.config.js
文件,定义编译输出
// rollup.config.jsexport default { input: "main.js", output: { file: "dist/bundle.js", format: "iife", },};
然后修改package.json
--config
指定配置文件, 简写-c
--bundleConfigAsCjs
因为配置文件是以.js
结尾的,通常建议使用.cjs
.
{ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "rollup --config rollup.config.js --bundleConfigAsCjs" }}
然后执行 npm run build
可以看到 生成的dis/bundle.js
也可以省略 配置文件,rollup 会自动加载根目录下的
rollup.config.js
,rollup --config --bundleConfigAsCjs
多入口打包文件,配置文件可以是数组对象
会有一些多入口页面打包,通过配置入口,删除不同目录文件的编译资源
定义rollup.config.js
文件
// rollup.config.jsexport default [ { input: "main.js", output: { file: "dist/bundle.js", format: "iife", } }, { input: "login.js", output: { file: "dist/login.js", format: "iife", } }],
如果想要输出多个类型的编译资源output
配置为数组
// rollup.config.jsexport default [ { input: "main.js", output: [ { file: "dist/bundle.js", format: "iife", }, { file: "dist/bundle-es.js", format: "es", }, { file: "dist/bundle-cjs.js", format: "cjs", } ] },],
可异步请求配置文件
如果是在线配置,存储在后端。可通过请求获取配置文件。
// rollup.config.jsimport ajax from "libs/ajax";export default ajax.get("/**/**/rolleup-config");
多接口、都入口配置,则改为
// rollup.config.jsimport ajax from "libs/ajax";export default Promise.all([ ajax.get("/**/**/rolleup-config-main"), ajax.get("/**/**/rolleup-config-login"),]);
通过命令行参数适用不同的配置文件
开发坏境和生产环境有不同的配置。通过命令行参数,使用对应的配置文件。
// rollup.config.jsimport devConfig from "./build/rollup.dev.config.js";import prdConfig from "./build/rollup.prd.config.js";export default (commandLineArgs) => { if (commandLineArgs.environment === "dev") { return devConfig; } return prdConfig;};
修改package.json
提供 dev、build 脚本
{ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "rollup --config --environment dev --bundleConfigAsCjs", "build": "rollup --config --bundleConfigAsCjs --environment prd" }}
rollup.config.js
配置文件说明
// rollup.config.js// can be an array (for multiple inputs)export default { // core input options external, input: "main.js", // 主入口文件配置路径 plugins, // 使用插件, // advanced input options cache, onwarn, preserveEntrySignatures, strictDeprecations, // danger zone acorn, acornInjectPlugins, context, moduleContext, preserveSymlinks, shimMissingExports, treeshake, // experimental experimentalCacheExpiry, perf, // required (can be an array, for multiple outputs) output: { // core output options dir: "dist", // 编译文件目录地址,多个编译文件则必须指定 file: "dist/bundle.js", // 编译后文件目录路径 format, // 文件编译类型 es cjs iife globals, name, plugins, // 针对某些输出的插件 // advanced output options assetFileNames, banner, chunkFileNames, compact, entryFileNames, extend, footer, hoistTransitiveImports, inlineDynamicImports, interop, intro, manualChunks, minifyInternalExports, outro, paths, preserveModules, preserveModulesRoot, sourcemap, sourcemapBaseUrl, sourcemapExcludeSources, sourcemapFile, sourcemapPathTransform, validate, // danger zone amd, esModule, exports, externalLiveBindings, freeze, indent, namespaceToStringTag, noConflict, preferConst, sanitizeFileName, strict, systemNullSetters, }, watch: { buildDelay, chokidar, clearScreen, skipWrite, exclude, include, },};
使用一个加载json
文件的插件
安装
$> npm i --save-dev @rollup/plugin-json
在配置中使用插件
// rollup.config.js prdimport PluginJson from "@rollup/plugin-json";export default { input: "main.js", output: { file: "dist/bundle.js", format: "iife", }, plugins: [PluginJson()],};
然后在项目中可以导入 JSON 文件,按对象取值。
import { version } from "./package.json";// import packageJson from "./package.json";console.log(version);
可以针对输出output
配置插件
最小化构建代码,压缩代码,安装@rollup/plugin-terser
$> npm install --save-dev @rollup/plugin-terser
修改配置文件,在编译类型为 es 的输出使用插件
// rollup.config.js devimport PluginJson from "@rollup/plugin-json";import PluginTerser from "@rollup/plugin-terser";export default { input: "main.js", output: [ { file: "dist/bundle.js", format: "iife", }, { file: "dist/bundle-es.js", format: "es", plugins: [PluginTerser()], }, { file: "dist/bundle-cjs.js", format: "cjs", }, ], plugins: [PluginJson()],};
执行npm run build
可以看到bundle-es.js
文件代码被压缩,没有任何格式
动态加载已使用代码拆分
在以下情况会自动进行代码拆分
- 动态加载模块
- 多入口引入统一模块。
- 通过输出配置
output.manualChunks
指定需要拆分的模块
[!] RollupError: Invalid value "iife" for option "output.format" - UMD and IIFE output formats are not supported for code-splitting builds.
编译类型 UMD、IIFE 是不支持代码拆分的。改用 cjs
实现login
模块的拆分,创建 login 文件入口。然后在 main.js 文件中动态引入
import("./login.js").then(() => console.log("成功加载login..."));
需要修改配置指定编译目录dir:"dist"
,原来指定的 file
只是编译生成一个文件包。现在拆分代码,会生成多个编译包。
// rollup.config.js prdimport PluginJson from "@rollup/plugin-json";export default { input: "main.js", output: { // file: "dist/bundle.js", format: "cjs", dir: "dist", }, plugins: [PluginJson()],};
定义插件,以满足定制化需求
编译时可能会需要一些定制化处理。通过自定义插件实现代码的转换。
示例实现一个移除console.log
的代码。一个插件约束
- 插件名需要以
rollup-plugin-**
开头 - package.json 中包含 rollup-plugin 关键字,构建后发布之前需要加前缀
- 经过全面的测试。
- 插件中尽可能的使用英文说明。
- 尽可能的使用异步方法读取文件,比如使用 fs.readFile 而不是 fs.readFileSync
- 插件是虚拟模块时,前缀追加
\0
.以便其他插件不去处理它。
项目目录下创建存储插件的位置 plugins/rollup-plugin-clear-console.js
// rollup-plugin-clear-consoleimport { createFilter } from "@rollup/pluginutils";export default function clearConsole(options = {}) { // filter file var filter = createFilter(options.include, options.exclude); return { name: "clear-console", transform(code, id) { /** * code 为加载的文件内容 * id 为当前内容文件的路径地址,通过filter判断是否符合处理的要求 */ if (!filter(id)) return; try { return { code: code.replace(/console\.log(\w*)/gi, ""), map: { mappings: "" }, }; } catch (err) { var message = "An error occurred during processing"; this.error({ message: message, id: id, cause: err }); return null; } }, };}
@rollup/pluginutils
是针对编写 rollup 插件封装的一些功能性的函数,比如示例中使用了createFilter
,可以帮助过滤指定的文件、排除指定文件。
在rollup.config.dev.js
使用自定义插件,并制定处理目录下为main.js
的文件。
// rollup.config.js prdimport PluginJson from "@rollup/plugin-json";// 自定义插件import PluginClearConsole from "../plugins/rollup-plugin-clear-console";export default { input: "main.js", output: { // file: "dist/bundle.js", format: "cjs", dir: "dist", }, plugins: [ PluginJson(), PluginClearConsole({ include: ["**/main.js"], }), ],};
然后执行脚本,看看效果npm run dev
在dis/main.js
文件中可以看到所有的console.log
都被移除。而且由于移除这些代码,一些导入的变量未被使用,也被 tree shaking 了。
可以看到拆包编译的login.js
文件中还是包含有console.log
代码的。
配置一起使用vue
需要安装的 vue 相关的插件, 在 rollup-awesome 官方推荐的组件库
$> npm install rollup-plugin-vue vue --save-dev
安装的都是最新版本,vue 版本为3.2.45
创建 src 目录,用于 vue 视图组件的存放位置。
// index.jsimport { createApp } from "vue";import App from "./App.vue";const app = createApp(App);app.mount("#app");
在项目目录下创建 index.html 文件
rollup-vue2 <script src="./dist/index.js"></script>
修改 rollup 配置文件rollup.config.dev.js
// rollup.config.dev.js devimport PluginJson from "@rollup/plugin-json";import PluginVue from "rollup-plugin-vue";// 自定义插件import PluginClearConsole from "../plugins/rollup-plugin-clear-console";export default { input: "./src/index.js", output: { // file: "dist/bundle.js", format: "es", dir: "dist", }, plugins: [ PluginVue(), PluginJson(), PluginClearConsole({ include: ["**/main.js"], }), ],};
然后执行 npm run dev ,打包编译后,通过live server
启动一个服务访问 index.html
服务启动页面不展示问题
- 页面打开后没有任何展示,控制台报错
Cannot use import statement outside a module
,查看编译包./dist/index.js
. 没有将 vue 一起打包进去。加载不到
解决,安装依赖@rollup/plugin-node-resolve
,将 vue 一起编译进去。
$> npm install @rollup/plugin-node-resolve --save-dev
修改配置,引入插件。 可以将 node_modules 中的组件包引入打包进编译包。
// rollup.config.dev.js devimport PluginNodeResolve from "@rollup/plugin-node-resolve";export default { // ... other plugins: [ // ... other PluginNodeResolve(), ],};
- 可以看到编译包变大了,vue 已经打包进去了,但是页面还不展示,报错
Uncaught ReferenceError: process is not defined
, 查看编译包./dist/index.js
,引用全局变量process.env.NODE_ENV
没有定义
解决,安装插件 @rollup/plugin-replace
$> npm install @rollup/plugin-replace --save-dev
修改配置,引入插件。 编译后替换编译包中的目标字符串。
// rollup.config.dev.js devimport PluginReplace from "@rollup/plugin-replace";export default { // ... other plugins: [ // ... other PluginReplace({ "process.env.NODE_ENV": JSON.stringify("development"), preventAssignment: true, }), ],};
页面打开展示正常。
生成 html 文件,npm run dev
创建一个服务
为了达到开发的目的,需要自动生成 html 文件,自动注入人编译后的资源包。还有其他资源的解析、加载等。
生成 html 文件
安装依赖插件,生成 index.html,并将所有编译的资源包添加到页面上。
$> npm install @rollup/plugin-html --save-dev
使用插件
// rollup.config.dev.js devimport PluginHtml from "@rollup/plugin-html";export default { // ... other plugins: [ // ... other PluginHtml({ title: "rollup-vue3", fileName: "index.html", }), ],};
开发模式,启动 serve 服务
安装依赖插件,启动一个服务
$> npm install rollup-plugin-serve --save-dev
使用插件
// rollup.config.dev.js devimport PluginServe from "rollup-plugin-serve";export default { // ... other plugins: [ // ... other PluginServe({ // 运行在浏览器中 open: true, // 运行成功后,打开的地址 openPage: "/", // 打印服务地址 verbose: true, // 地址,端口号 // host:"::", host: "127.0.0.1", port: 8009, // https 协议配置 // https: {}, // 运行成功,事件 onListening: function (server) { const address = server.address(); const host = address.address === "::" ? "localhost" : address.address; // by using a bound function, we can access options as `this` const protocol = this.https ? "https" : "http"; console.log( `Server listening at ${protocol}://${host}:${address.port}/` ); }, }), ],};
运行成功后,未自动打开浏览器,serve 配置中的 open、openPage 暂时没有发现其作用设置"::"不生效,设置为“127.0.0.1” 启动后正常打开。
--watch
监听模式,开发是文件变动重新编译
服务虽然启动了,但也仅仅是一个静态资源的服务,在开发的时候,通常需要实时编译改动的文件,希望立刻看到变化
修改启动脚本,在监听模式下,文件发生更改,就会重新编译。--watch 等同于 -w
{ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "dev": "rollup --config --environment dev --bundleConfigAsCjs -w", + "dev": "rollup --config --environment dev --bundleConfigAsCjs", },}
虽然重新编译了,但是浏览器中还是需要手动刷新才能看到变化。--需要唤起浏览器服务的插件--
解析.vue
中的样式 style
在 App.vue 中书写了样式,发现在页面中没有生效
增加插件postcss \ rollup-plugin-postcss
$> npm i postcss rollup-plugin-postcss -D
配置rollup.config.dev.js
import PluginPostCss from "rollup-plugin-postcss";export default { //... plugins: [ //... PluginPostCss(), ],};
重新运行,可以看到样式生效了。默认编译后的 css 样式是注入到 html 的 head 中。
使用预编译 less
安装 less
$> npm i less -D
即可直接使用
支持 JSX 语法
比较喜欢 jsx 语法的书写方式,实现相关配置;
import { defineComponent } from "vue";export default defineComponent({ name: "IFunLazySelect", render() { return ( {/* 相关代码 */} })
安装 @vue/babel-plugin-jsx
, 还需要安装@babel/core 、@babel/preset-env
$> npm install @vue/babel-plugin-jsx @babel/core @babel/preset-env -D
新建.babelrc.js
,配置
module.exports = { presets: [["@babel/env", { modules: false }]], plugins: ["@vue/babel-plugin-jsx"],};
这只是 babel 配置,还需要集成到 rollup 中,使之生效,安装@rollup/plugin-babel
则需要修改rollup.config.base.js
,增加插件配置。
// rollup.config.base.jsimport PluginBabel from "@rollup/plugin-babel";export default { plugins: [ // ... other PluginBabel({ babelHelpers: "bundled" }), ],};
重新启动项目,完美运行。
其他插件
- 解析 commonJS 模块,转换成 es6 模块。安装依赖
$> npm install @rollup/plugin-commonjs --save-dev
修改配置
// rollup.config.dev.js devimport PluginCommonJS from "@rollup/plugin-commonjs";export default { // ... other plugins: [ // ... other PluginCommonJS(), ],};
- 全局注入,比如使用 jquery,安装依赖
$> npm install @rollup/plugin-inject --save-dev
修改配置
// rollup.config.dev.js devimport PluginInject from "@rollup/plugin-inject";export default { // ... other plugins: [ // ... other PluginInject({ $: "jquery", }), ],};
- 定义别名路径,比如通常使用
@
代替./src
路径
$> npm install @rollup/plugin-alias --save-dev
修改配置
// rollup.config.dev.js devimport PluginAlias from "@rollup/plugin-alias";export default { // ... other plugins: [ // ... other PluginAlias({ entries: { "@": "../src", libs: "../libs", }, }), ],};
- 加载图片资源,
.png\.jpeg\.svg
等
$> npm install @rollup/plugin-image --save-dev
修改配置
// rollup.config.dev.js devimport PluginImage from "@rollup/plugin-image";export default { // ... other plugins: [ // ... other PluginImage(), ],};
关键词:
初识rollup 打包、配置vue脚手架
世界热议:62.类模板
当前热文:C语言——可变参函数
陕西招聘会现3万月薪岗位学生排长龙 招聘人员:半天收简历150份
当前动态:供不应求!真我GT Neo5 1TB版真香:二手用户也抢着要
“山药成了精”?男子买到奇葩山药外形酷似人脚掌
每日视点!快速读懂Redis分布式锁的实现和原理
美少女三消游戏 《Mirror 2: Project X》开发组宣布破产解散
酒店回应到211大学招服务员:符合流程 面向所有高校毕业生
快看点丨京东CEO徐雷:百亿补贴效果超过预期、要做天天低价
【新要闻】比亚迪加入降价大军!宋Pro DM-i限时优惠:88元折扣6888元
焦点简讯:耳机煲机一般要煲多久_耳机煲机方法是什么?买回来新耳机要怎样煲?耳机要煲多久?
世界热点评!前端如何相对优雅管理api
全球速看:浙四医院官网招聘2021_浙四医院官网
环球观点:京东2022年收入超1万亿:“百亿补贴”会一直有!
简约时尚 健身备一件:361°新款轻薄速干衣39元冲量
越来越卖不动了!最畅销十款数码相机一览:索尼成赢家 第一性价比绝
全球通讯!Intel的大小核CPU架构:最终还是把一些老游戏坑了
往返近1000元!景区回应坐滑竿上山按斤收费:网友力挺明码标价
天天实时:【翻译】发布 .NET 8 Preview 1
前沿资讯!海洋风筝爆火 一周暴涨498%超过秋裤!网友:春天的信号
天天消息!甜香丝滑 旺旺邦德低脂轻乳咖啡官方狂促:合2元一瓶
《银河护卫队3》导演回击网友言论:确定选角不因其是黑人
世界热议:东风系引发车市价格大战!纯电宝马i3终端大促销:最大降幅超10万
每日热点:日本原药温和驱蚊配方:超威电热蚊香液3瓶1器14.9元发车
快讯:uni-popup 遮不住头部标题的解决办法
环球焦点!网友晒空荡新房 各大品牌疯狂随份子 开局一套房其他全靠送
快播:女子在地铁上脱鞋抠脚死皮掉一地 杭州地铁回应:列车到站会打扫
世界速递!为拯救者Y9000P 2023量身打造:联想推出新140W氮化镓适配器
每日看点!富士康否认清退临时工拆除流水线:运转正常
全球即时:美国一特斯拉撞上消防车造成一死一伤 现场惨烈!调查结果让人心痛
Envisics获得5000万美元C轮融资
当前滚动:(数据库系统概论|王珊)第十一章并发控制-第二、三、四节:封锁、封锁协议活锁和死锁
每日焦点!「中华田园敏捷开发」,是老板无能还是程序员无力?
【世界聚看点】探究SMC局部代码加密技术以及在CTF中的运用
记录--Vue自定义指令实现加载中效果v-load(不使用Vue.extend)
【焦点热闻】十分钟读懂火山引擎 DataLeap 数据治理实践
老头环壶头哥:击败女武神超4千次 期待DLC到来
天天资讯:儿子沉迷手机爸爸帮请假“逼”他连玩17小时:效果很好
焦点消息!供应iPhone 15的OLED屏幕漏光?国产面板一哥京东方回应:不予评价
当前关注:纵享丝滑 回味愉悦:德芙巧克力37.5元/斤(官价5折)
每日速看!成龙进组20天把半年的封闭用完了!新电影《龙马精神》4月上映:有吴京参演
每日视点!通过案例讲解python循环语句
【全球独家】基于应用理解的协议栈优化
关注:串口登录提示"Login incorrect"
热推荐:节能降耗 | AIRIOT智慧电力综合管理解决方案
实时:C++笔记--函数、预处理
【天天播资讯】为啥人一上车就爱睡觉?原来是被“催眠”了
全球观察:95后大厂女生裸辞开麻将馆当保洁:很享受自由和成就感
全球今日报丨2030年前后我国将实施火星采样返回:难度很大
【全球播资讯】特斯拉中国2月销量出炉 比亚迪能打5个特斯拉
航班晚点 山航机长提速帮乘客5分钟极限转机:提前20分钟到达
速递!首钢股份:2月重点产品产量同比均提升 预计国内钢材价格短期震荡偏强
焦点播报:Python常见面试题012. 可迭代对象和迭代器有啥区别?
从5分钟到60秒,袋鼠云数栈在热重启技术上的提效探索之路
世界观天下!我的脑内恋碍选项第二季会出吗_我的脑内恋碍选项第二季
【天天报资讯】ChatGPT火出圈!人工智能工程师平均招聘月薪突破2.5万
环球热文:三星推出冰淇淋主题键鼠套装:薄荷配色如此清凉
集成ChatGPT威力显著:微软Bing日活跃首次破亿
每日快报!3月罕见!郑州今日冲上30°C高温:成北方首个30℃+省会级城市
世界球精选!RTX 50显卡有望使用 GDDR7显存验证方案来了:狂飙36Gbps
无界生态发布会即将举办 焕新后的星纪魅族将带来哪些惊喜?
java代码审计-XSS
全球今日讯!vue中将base64流数据转成pdf文件可打印
环球速讯:1 MySql基础介绍
世界观焦点:英媒:多特蒙德中场贝林厄姆将决定自己的未来
观察:今年五一档已定档10部新片 王一博《长空之王》超65万人想看
天天热讯:海上巨无霸 我国自主研制的全球最大集装箱船今天交付
全球讯息:日本H3火箭首秀失败初步调查结果公布:电源系统异常
重获新“声”!清华开发出可穿戴人工喉咙:还原准确率超90%
天天热点评!美国一邮轮300多人患病呕吐腹泻:疑似感染诺如病毒
React Hooks源码深度解析
当前热文:虹科分享 | B站崩了怎么办?Redis企业版数据库多云战略分析
每日速读!Math.atan2求角度解析
快速打包、发布和管理应用——AppUploader工具介绍
星纪魅族集团宣布成立 全面推行新战略,新理念
热资讯!说唱女歌手转行卖烧烤年入百万 直言:梦想和生活不矛盾
全球观察:索尼α7 IV发布2.00版本固件:增加Creators' App支持
全风化和强风化哪个硬?全风化和强风化的区别是什么?
牛转乾坤是什么意思?牛转乾坤放在家里哪个位置?
离不开你是哪部电视剧主题曲?离不开你的原唱是谁?
惊艳世俗的名字有哪些?惊艳世俗的小说句子有哪些?
卧铺有充电的地方吗?卧铺补票怎么补怎么收费?
每日关注!C++笔记--数组、函数、预处理
索爱mk16i支持通话录音吗?索爱mk16i拍照效果怎么样?
双胡须造型着实罕见!腾势N7申报:首款激光雷达比亚迪来了
网易3A级赛车手游《巅峰极速》今日首测 全球超百款跑车正版授权
汽车和小孩被劫 定位要先续流量费!大众汽车宣布重大决定
讯息:股价涨停 中国上市公司永鼎回应美国室温超导技术:目前不可行
当前看点!财运好的男人手相 什么手相最有财运
IM通讯协议专题学习(六):手把手教你如何在Android上从零使用Protobuf
GO语言学习笔记-方法篇 Study for Go ! Chapter five - Method
每日看点!面试被问到了解哪些开发模型?看这一篇就够了!
热键是什么意思?热键冲突怎么解决?
微信怎么群发消息?微信怎么分组管理好友?
环球微资讯!绝无系统广告!蔚来手机真机曝光:神似索尼
每日看点!比亚迪F品牌越野SUV谍照曝光:对标奔驰大G 价格40万起
每天少睡一两个小时算熬夜?专家提醒:大脑会变笨
A4车主免费变成“A5”车主?奥迪做出重大决定
委员建议在农村淘汰老头乐!推广更好的新能源汽车