登录以发布
  • 西北 旅游 85 0 1 发布

    陕西,简称“陕”或“秦”,中华人民共和国省级行政区,省会西安,位于中国内陆腹地,黄河中游,东邻山西、河南,西连宁夏、甘肃,南抵四川、重庆、湖北,北接内蒙古,介于东经105°29′—111°15′,北纬31°42′—39°35′之间,总面积20.56万平方千米。中国经纬度基准点大地原点和北京时间国家授时中心位于该省。

    主要旅游景点景点等级门票开放时间地址/电话1西安市秦始皇陵兵马俑博物馆
    5A旺季150元;淡季120元8:30~18:35陕西省西安市临潼区
    029~81399170、81399174
    2西安市华清池景区
    5A
    150元
    恨歌舞剧门票价格:238元
    旺季7:00-18:30
    淡季 7:30-18:00;
    西安市临潼区骊山北侧
    029-68960262
    3延安市黄帝陵景区
    5A
    旺季91元
    淡季51元
    8:00~19:00
    陕西
    0911-5212742、5216510
    4西安大雁塔·大唐芙蓉园景区
    5A
    旺季120元
    淡季90元
    9:00-21:00
    陕西省西安市芙蓉西路99号
    029-85511888
    5渭南市华山景区
    5A
    旺季180元
    淡季100元
    ①西山门:全天
    ②东山门:旺季7:00-19:00,淡季9:00-17:00陕西省渭南华阴市玉泉路
    400-0913-777、029-4362691
    6法门寺佛文化景区
    5A
    100元
    9:00-18:00
    陕西省宝鸡市扶风县法门镇
    0917-5258888
    7商洛市金丝峡景区
    5A
    100元(预订优惠价:95元)
    旺季7:00-16:30
    淡季7:30-16:00
    陕西商洛
    0914-6566888
    8宝鸡市太白山旅游景区
    5A
    门票价格:160元(预订优惠价:140元)
    08:00~18:00
    陕西
    400-639-1615、0917-5711682
    9西安市城墙·碑林历史文化景区
    5A

    西安市秦始皇陵兵马俑博物馆

    秦始皇兵马俑博物馆位于陕西省西安市临潼区城东,是中国第一个封建皇帝秦始皇嬴政的陵园中一处大型从葬坑,陵园面积218万平方米。博物馆以秦始皇兵马俑为基础,在兵马俑坑原址上建立的遗址类博物馆,也是中国最大的古代军事博物馆。

    秦始皇兵马俑博物馆共有一、二、三号3个兵马俑坑。一号坑是一个以战车和步兵相间的主力军阵,总面积14260平方米,约有6000个真人大小的陶俑。二号坑是秦俑坑中的精华,面积6000平方米,由四个单元组成,四个方阵由战车、骑兵、弩兵混合编组,严整有序,无懈可击。三号坑是军阵的指挥系统,面积524平方米。

    西安市华清池景区

    华清池是位于唐华清宫遗址之上的一座皇家宫苑,西距西安30公里, 南依骊山,北面渭水。因其亘古不变的温泉资源、唐明皇与杨贵妃的爱情故事、西安事变发生地以及丰厚的人文历史资源而成为中国著名的文化旅游景区,全国重点文物保护单位,国家首批AAAAA级旅游示范景区。
    主要有唐华清宫御汤遗址博物馆、西安事变旧址、九龙湖与芙蓉湖风景区、唐梨园遗址博物馆,有飞霜殿、昭阳殿、长生殿、环园和禹王殿等标志性建筑群,有体验皇家温泉的以澜汤殿、御汤苑、星辰苑、尚食苑、长汤苑、少阳苑、香凝阁和御膳阁为主的华清御汤(精品)酒店。

    延安市黄帝陵景区

    延安黄帝陵,位于陕西省延安南部的皇陵县城北的桥山上,是《史记》记载的唯一一座黄帝陵,为全国重点文物保护单位,国家AAAAA
    山麓有建于汉代的轩辕庙,庙东侧碑廊珍藏历代帝王御制祭文碑57通,现又新增香港、澳门“回归纪念碑”。黄帝陵古柏群,是中国最古老、覆盖面积最大、保存最完整的古柏群,共8万余株,千年以上3万余。

    西安大雁塔·大唐芙蓉园景区

    大唐芙蓉园位于陕西省西安市城南的曲江开发区,大雁塔东南侧,它是在原唐代芙蓉园遗址以北,仿照唐代皇家园林式样重新建造的,是中国第一个全方位展示盛唐风貌的大型皇家园林式文化主题公园,占地面积1000亩,其中水域面积300亩。
    大唐芙蓉园于2002年开始建设,2004年落成,2005年4月11日(农历三月初三)正式对外开放。  大唐芙蓉园内建有紫云楼、仕女馆、御宴宫、杏园、芳林苑、凤鸣九天剧院、唐市等许多仿古建筑,是中国最大的仿唐皇家建筑群,景区由中国工程院院士张锦秋担纲总体规划和建筑设计。

    渭南市华山景区

    陕西渭南华山景区位于陕西省渭南市华阴市,在西安市以东120公里处。南接秦岭,北瞰黄渭。华山古称“西岳”,为中国著名的五岳之一。华山是道教主流全真派圣地,也是汉族民间广泛崇奉的神祇,即西岳华山君神。截至2013年华山有72个半悬空洞,道观20余座,其中玉泉院、都龙庙、东道院、镇岳宫被列为全国重点道教宫观。

    法门寺佛文化景区

    法门寺文化景区位于陕西省宝鸡市扶风县城北10公里处的法门镇,东距西安市110千米,西距宝鸡市90千米。始建于东汉末年恒灵年间,至今约有1700多年历史,有“关中塔庙始祖”之称,因安置释迦牟尼佛指骨舍利而成为举国仰望的佛教圣地。2009年5月9日,法门寺文化景区建成对外开放。

    法门寺文化景区,占地1300亩,由山门广场、佛光大道、法门寺寺院、合十舍利塔,以及众多雕塑组成。

    商洛市金丝峡景区

    金丝峡景区是中国最美十大峡谷之一,位于陕西省商南县境内的东南部新开岭腹地,距县城60公里,距金丝峡镇18公里。园内风光秀丽,风格独特,风景如画,具有有窄、长、秀、奇、险、幽的特点,集峰、石、洞、林、禽、兽、泉、潭、瀑等自然景观于一体,步移景异,景象万千。被誉为"峡谷奇观,生态王 国"。先后荣获国家森林公园、国家地质公园、国家水利风景区、国家AAAAA级旅游景区、中国最美十大峡谷、中国王牌景区、生态中国贡献奖等二十多项殊荣,成为中国生态旅游业中一颗璀璨明珠。白龙峡,俗称七里峡、北峡。峡口左侧的山峰叫凤山,犹如凤凰展翅;右侧山峰叫猴山,山头有一石猴,有仙猴戏凤之说。左侧山坡上还有一个拔地而起的奇石叫仙人石,亦称仙人峰。坡上怪石嶙峋,青藤倒挂,自然景观妙趣横生。

    宝鸡市太白山旅游景区

    太白山是国家AAAAA级旅游景区、国家森林公园、国家水利风景区、全国体育旅游十大景区、“美丽中国”十佳度假区、中国最具吸引力十大旅游目的地、中国最美生态旅游目的地、中国登山摇篮。 

    太白山国家森林公园位于秦岭主峰太白山北麓的陕西省宝鸡市眉县境内,公园面积2949公顷,森林覆盖率94.3%。公园以森林景观为主体,苍山奇峰为骨架,清溪碧潭为脉络,文物古迹点缀其间,自然景观与人文景观浑然一体,是中国西部不可多得的自然风光旅游区,被誉为中国西部的一颗绿色明珠。包括10个景区,180多个景点。公园海拔高度从620米到3511米,是中国海拔最高的国家森林公园。

    西安市城墙·碑林历史文化景区

    西安城墙景区,国家AAAAA级旅游景区,是以西安古城墙为主题,集护城河、环城林带(包括城河外沿)、顺城路四位一体的环城风景区,是保存最完整的中国古代城垣建筑。
    西安城墙包括护城河、吊桥、闸楼、箭楼、正楼、角楼、敌楼、女儿墙、垛口等一系列军事设施,构成严密完整的军事防御体系。东西南北四面均开设城门,东名“长乐”,西名“安定”,南名“永宁”,北名“安远”。

  • 东北 旅游 144 0 1 发布

    黑龙江省,中国23个省之一,位于东北地区,简称“黑”,省会哈尔滨,是中国最北端以及陆地最东端的省级行政区,总面积47.3万平方公里。

    主要旅游景点景点等级门票开放时间地址/电话1哈尔滨市太阳岛公园
    5A240元08:00 - 17:00黑龙江省哈尔滨市松北区太阳岛风景区警备路3号
    0451-88192966
    2黑河市五大连池景区
    5A
    联票240元
    旺季06:00-18:30
    淡季08:00-17:00
    黑龙江省黑河
    0456-7296999
    3牡丹江市镜泊湖景区
    5A
    100元(预订优惠价:95元)
    24小时全天开放
    黑龙江省牡丹江
    0453-6270180
    4伊春市汤旺河林海奇石景区
    5A
    80元(预订优惠价:75元)
    8:00~16:30
    黑龙江省伊春市汤旺河区
    045~83574029
    5黑龙江省漠河北极村旅游区
    5A
    60元24小时全天开放中国最北部边陲小村里

    哈尔滨市太阳岛公园

    太阳岛与附近诸岛和沙洲组成了太阳岛风景区,是游览和避暑的疗养胜地。岛上有水阁云天、仙鹤群、母子鹿、长堤垂柳等20余个风景点,游览区内建有太阳山、太阳湖、荷花湖、姊妹桥、亭桥、白玉桥、上坞桥、水阁云天、儿童乐园、丁香园、花卉园、太阳岛志石、锦江长廊、沿江风景线等数十处特色景观,构成了山湖相映、清泉飞瀑、亭桥映柳、荷香鱼跃的美丽景色,给人们增添了无限遐思。

    黑河市五大连池景区

    五大连池风景区是国家AAAAA级景区、世界地质公园、世界人与生物圈保护区、国际绿色名录、国家重点风景名胜区、国家级自然保护区、国家森林公园、国家自然遗产、中国矿泉水之乡
    五大连池风景区由五大连池湖区:莲花湖、燕山湖、白龙湖、鹤鸣湖、如意湖组成串珠状的湖群,以及周边火山群地质景观、相关人文景观、植被、水景等组成。植物618种,野生动物397种,与同纬度地区相比,动植物种类十分丰富,成为生态演变过程的主要见证,展示了大自然顽强的生命力,是世界上研究物种适应和生物群落演化的最佳地区。

    牡丹江市镜泊湖景区

    镜泊湖国家级风景名胜区,国家AAAAA级旅游景区,世界地质公园,中国十佳休闲旅游胜地,与千岛湖相媲美,有沙石之雕,兔耳岭之风情。
    镜泊湖以湖光山色为主,兼有火山口地下原始森林、地下熔岩隧道等地质奇观,及唐代渤海国遗址为代表的历史人文景观,是可供科研、避暑、游览、观光、度假和文化交流活动的综合性景区。镜泊湖婉如一颗璀夺目的明珠镶嵌在祖国北疆上,以独特的朴素无华的自然美闻名于世,吸引着越来越多的国内外游人。

    伊春市汤旺河林海奇石景区

    林海奇石,国家5A级景区,避暑佳地,游山玩水的首选,位于黑龙江省伊春市汤旺河区境内,是由人文景观和自然景观构成的生态旅游新区和国家地质遗迹公园,分为石林景观区和山水风光游览区。
    林海奇石景区可分为天然牧场、雪色松林、溪水湿地、民族风情、山水浏览、兴安石林、秋色松林、花卉观赏八大区域。
    著名景点 一线天、剑劈山、天犬岩、云靴顶等、罗汉龟、雄峰、护山大将军等。

    黑龙江省漠河北极村旅游区

    北极村位于地处黑龙江省漠河县临江小镇,大兴安岭山脉北麓的七星山脚下,是中国唯一观测北极光的最佳地点,是中国“北方第一哨”所在地,也是中国最北的城镇。

  • 东北 旅游 90 0 1 发布

    吉林省,简称“吉”,是中华人民共和国省级行政区,省会长春。位于中国东北地区中部,与辽宁、内蒙古、黑龙江相连,并与俄罗斯、朝鲜接壤,地处东北亚地理中心位置。截至2017年底,下辖8个地级市、1个自治州,共有20个县级市,16个县,3个自治县,21个市辖区。

    主要旅游景点景点等级门票开放时间地址/电话1长春市伪满皇宫博物院
    5A180元8:30-17:20吉林省长春市东北隅的光复北路五号
    0431-82866611、82860547
    2长白山景区
    5A
    318元
    8:30-17:00
    吉林省延边
    0433-5410000
    3长春市净月潭景区
    5A
    30元(预订特价27元)
    8:30-16:30
    吉林
    0431-84513527
    4长春市长影世纪城旅游区
    5A

    旺季240元
    淡季198元夏季09:00~17:30
    冬季09:00~16:30
    吉林
    0431-84550888
    5敦化市六鼎山文化旅游区
    5A
    110元(预订优惠价:100元)
    夏季7:30~17:00
    冬季7:30~16:30
    吉林省延边
    0433-6688288、6688330
    6长春市世界雕塑公园旅游景区
    5A
    60元(预订特价48元)
    冬季8:00-16:30
    夏季7:30-17:30
    吉林省长春市南关区人民大街9518号
    0431-85379001

    长春市伪满皇宫博物院

    伪满皇宫博物院现有包括缉熙楼、勤民楼、同德殿等伪满宫廷原状陈列50个,大型基本陈列2个,专题展览3个,举办临时展览33个,中国国内巡展17个,出国展览11个。伪满皇宫博物院收藏了大批伪满宫廷文物、日本近现代文物、东北近现代文物、民俗文物、近现代有代表性的书画、雕刻、非遗传承人作品等艺术精品。

    长白山景区

    长白山景区是国家AAAAA级旅游景区,主峰长白山多白色浮石与积雪而得名,素有“千年积雪万年松,直上人间第一峰”的美誉。景区是拥有“神山、圣水、奇林、仙果”等盛誉的旅游胜地,也是满族的发祥地,在清代有“圣地”之誉,

    长春市净月潭景区

    长春净月潭为国家5A级旅游景区、国家级风景名胜区、国家森林公园、国家级水利风景区和国家级全民健身户外活动基地,位于吉林
    净月潭既有历史人文遗迹,又有自然风光,还有现代娱乐等多处旅游观光和娱乐景点,主要分布在净月潭的北面,著名的有碧松净月塔楼、沙滩浴场、避暑山庄、鹿苑、北普陀寺等,在净月潭的南面还有圣诞乐园、高尔夫球场、森林浴场、滑雪场、赛马场等。

    长春市长影世纪城旅游区

    长影世纪城,位于吉林省长春市南关区,始建于2003年,是集科技、冒险、演艺、观光于一体的综合性旅游区。长影世纪城主要景点由华夏翱翔、空间迷城、精灵王国等多余处景观组成,占地面积100万平方米,是一处特效电影主题公园 。

    敦化市六鼎山文化旅游区

    敦化市六鼎山文化旅游区位于敦化市南郊3公里处牡丹江南岸,规划面积52平方公里,由中国旅游设计院规划设计。重点开发佛教文化、清始祖文化、渤海文化等人文旅游项目。敦化市六鼎山文化旅游区,为国家5A级景区,省级旅游开发区,景区内集渤海文化、佛教文化和清始祖文化于一体。

    长春市世界雕塑公园旅游景区

    长春世界雕塑公园,位于长春市人民大街南部。占地面积92公顷,其中水域面积11.8公顷。是一个融汇当代雕塑艺术、展示世界雕塑艺术流派的主题公园,是集自然山水与人文景观相融的一座现代城市雕塑公园。拥有从法国罗丹博物馆引进的罗丹的大型雕塑作品《思想者》、《青铜时代》、《加莱义民》、《行走的人》等著名作品。

  • 开发工具 100 0 1 发布

    ebpack 是什么?

    本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

     webpack快速了解几个基本的概念mode 开发模式

    webpack 提供 mode 配置选项,配置 webpack 相应模式的内置优化。

    // webpack.production.config.js module.exports = { + mode: 'production', } 入口文件(entry)

    入口文件,类似于其他语言的起始文件。比如:c 语言的 main 函数所在的文件。

    入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。

    可以在 webpack 的配置文件中配置入口,配置节点为: entry,当然可以配置一个入口,也可以配置多个。

    输出(output)

    output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件。

    const path = require('path'); module.exports = { entry: './path/to/my/entry/file.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'my-first-webpack.bundle.js' } }; loader

    loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后你就可以利用 webpack 的打包能力,对它们进行处理。

    插件(plugins)

    loader 被用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。插件接口功能极其强大,可以用来处理各种各样的任务。

    webpack 的安装

    请确保安装了 Node.js 的最新版本。而且已经在您的项目根目录下已经初始化好了最基本的package.json文件

    本地安装 webpack$ npm install --save-dev webpack # 如果你使用 webpack 4+ 版本,你还需要安装 CLI。 npm install --save-dev webpack-cli

    安装完成后,可以添加npm的script脚本

    // package.json "scripts": { "start": "webpack --config webpack.config.js" } 全局安装 webpack(不推荐)

    将使 webpack 在全局环境下可用:

    npm install --global webpack

    注意:不推荐全局安装 webpack。这会将你项目中的 webpack 锁定到指定版本,并且在使用不同的 webpack 版本的项目中,可能会导致构建失败。

    快速入门完整 demo第一步:创建项目结构

    首先我们创建一个目录,初始化 npm,然后 在本地安装 webpack,接着安装 webpack-cli(此工具用于在命令行中运行 webpack):

    mkdir webpack-demo && cd webpack-demo npm init -y npm install webpack webpack-cli --save-dev

    项目结构

    webpack-demo + |- package.json + |- /dist + |- index.html + |- /src + |- index.js 第二步:安装 loadash 依赖和编写 js 文件npm install --save lodash

    编写:src/index.js 文件

    import _ from 'lodash'; function createDomElement() { let dom = document.createElement('div'); dom.innerHTML = _.join(['aicoder', '.com', ' wow'], ''); return dom; } document.body.appendChild(createDomElement());

    index.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>起步</title> </head> <body> <script src="./main.js"></script> </body> </html> 第三步:编写 webpack 配置文件

    根目录下添加 webpack.config.js文件。

    webpack-demo |- package.json + |- webpack.config.js |- /dist |- index.html |- /src |- index.js

    webpack.config.js 内容如下:

    const path = require('path'); module.exports = { mode: 'development', entry: './src/index.js', output: { filename: 'main.js', path: path.resolve(__dirname, './dist') } }; 执行构建任务

    直接执行构建任务:

    npx webpack

    打开: dist/index.html 可以查看到页面的结果。

    加载非 js 文件

    webpack 最出色的功能之一就是,除了 JavaScript,还可以通过 loader 引入任何其他类型的文件

    加载 CSS 文件第一步: 安装 css 和 style 模块解析的依赖 style-loader 和 css-loadernpm install --save-dev style-loader css-loader 第二步: 添加 css 解析的 loaderconst path = require('path'); module.exports = { entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.css$/, use: ['style-loader', 'css-loader'] } ] } }; css-loader: 辅助解析 js 中的 import './main.css'style-loader: 把 js 中引入的 css 内容 注入到 html 标签中,并添加 style 标签.依赖 css-loader

    你可以在依赖于此样式的 js 文件中 导入样式文件,比如:import './style.css'。现在,当该 js 模块运行时,含有 CSS 字符串的 <style> 标签,将被插入到 html 文件的 <head>中。

    第三步: 编写 css 文件和修改 js 文件

    在 src 目录中添加 style.css文件

    webpack-demo |- package.json |- webpack.config.js |- /dist |- bundle.js |- index.html |- /src + |- style.css |- index.js |- /node_modules

    src/style.css

    .hello { color: red; }

    修改 js 文件

    import _ from 'lodash'; + import './style.css'; function createDomElement() { let dom = document.createElement('div'); dom.innerHTML = _.join(['aicoder', '.com', ' wow'], ''); + dom.className = 'hello'; return dom; } document.body.appendChild(createDomElement());

    最后重新打开 dist 目录下的 index.html 看一下文字是否变成了红色的了。

    module 配置补充

    模块(module): 这些选项决定了如何处理项目中的不同类型的模块。

    webpack 模块可以支持如下:

    ES2015 import 语句CommonJS require() 语句AMD define 和 require 语句css/sass/less 文件中的 @import 语句。样式(url(...))或 HTML 文件(<img src=...>)中的图片链接(image url)module.noParse

    值的类型: RegExp | [RegExp] | function

    防止 webpack 解析那些任何与给定正则表达式相匹配的文件。忽略的文件中不应该含有 import, require, define 的调用,或任何其他导入机制。忽略大型的 library 可以提高构建性能。

    module.exports = { mode: 'devleopment', entry: './src/index.js', ... module: { noParse: /jquery|lodash/, // 从 webpack 3.0.0 开始,可以使用函数,如下所示 // noParse: function(content) { // return /jquery|lodash/.test(content); // } } ... }; module.rules

    创建模块时,匹配请求的规则数组。这些规则能够修改模块的创建方式。这些规则能够对模块(module)应用 loader,或者修改解析器(parser)。

    module.exports = { ... module: { noParse: /jquery|lodash/, rules: [ { test: /\.css$/, use: ['style-loader', 'css-loader'] } ] } ... }; module RuleRule 条件详解字符串:匹配输入必须以提供的字符串开始。是的。目录绝对路径或文件绝对路径。正则表达式:test 输入值。函数:调用输入的函数,必须返回一个真值(truthy value)以匹配。条件数组:至少一个匹配条件。对象:匹配所有属性。每个属性都有一个定义行为。Rule.test{ test: Condition }:匹配特定条件。一般是提供一个正则表达式或正则表达式的数组,但这不是强制的。module.exports = { ... module: { rules: [ { test: /\.css$/, use: ['style-loader', 'css-loader'] } ] } ... };

    其他的条件比如:

    { include: Condition }:匹配特定条件。一般是提供一个字符串或者字符串数组,但这不是强制的。{ exclude: Condition }:排除特定条件。一般是提供一个字符串或字符串数组,但这不是强制的。{ and: [Condition] }:必须匹配数组中的所有条件{ or: [Condition] }:匹配数组中任何一个条件{ not: [Condition] }:必须排除这个条件module.exports = { ... module: { rules: [ { test: /\.css$/, include: [ path.resolve(__dirname, "app/styles"), path.resolve(__dirname, "vendor/styles") ], use: ['style-loader', 'css-loader'] } ] } ... }; Rule.use

    应用于模块指定使用一个 loader。

    Loaders can be chained by passing multiple loaders, which will be applied from right to left (last to first configured).

    加载器可以链式传递,从右向左进行应用到模块上。

    use: [ 'style-loader', { loader: 'css-loader' }, { loader: 'less-loader', options: { noIeCompat: true } } ];

    传递字符串(如:use: [ "style-loader" ])是 loader 属性的简写方式(如:use: [ { loader: "style-loader "} ])。

    加载 Sass 文件

    加载 Sass 需要sass-loader。

    安装

    npm install sass-loader node-sass webpack --save-dev

    使用:

    // webpack.config.js module.exports = { ... module: { rules: [{ test: /\.scss$/, use: [{ loader: "style-loader" }, { loader: "css-loader" }, { loader: "sass-loader" }] }] } };

    为 sass 文件注入内容:

    如果你要将 Sass 代码放在实际的入口文件(entry file)之前,可以设置 data 选项。此时 sass-loader 不会覆盖 data 选项,只会将它拼接在入口文件的内容之前。

    { loader: "sass-loader", options: { data: "$env: " + process.env.NODE_ENV + ";" } }

    注意:由于代码注入, 会破坏整个入口文件的 source map。 通常一个简单的解决方案是,多个 Sass 文件入口。

    创建 Source Map

    css-loader和sass-loader都可以通过该 options 设置启用 sourcemap。

    // webpack.config.js module.exports = { ... module: { rules: [{ test: /\.scss$/, use: [{ loader: "style-loader" }, { loader: "css-loader", options: { sourceMap: true } }, { loader: "sass-loader", options: { sourceMap: true } }] }] } }; PostCSS 处理 loader(附带:添加 css3 前缀)

    PostCSS是一个 CSS 的预处理工具,可以帮助我们:给 CSS3 的属性添加前缀,样式格式校验(stylelint),提前使用 css 的新特性比如:表格布局,更重要的是可以实现 CSS 的模块化,防止 CSS 样式冲突。

    我们常用的就是使用 PostCSS 进行添加前缀,以此为例:

    安装

    npm i -D postcss-loader npm install autoprefixer --save-dev # 以下可以不用安装 # cssnext可以让你写CSS4的语言,并能配合autoprefixer进行浏览器兼容的不全,而且还支持嵌套语法 $ npm install postcss-cssnext --save-dev # 类似scss的语法,实际上如果只是想用嵌套的话有cssnext就够了 $ npm install precss --save-dev # 在@import css文件的时候让webpack监听并编译 $ npm install postcss-import --save-dev const path = require('path'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); module.exports = { mode: 'development', entry: './src/index.js', output: { filename: 'main.js', path: path.resolve(__dirname, './dist') }, module: { rules: [ { test: /\.(sa|sc|c)ss$/, use: [ 'style-loader', { loader: 'css-loader', options: { sourceMap: true } }, { loader: 'postcss-loader', options: { ident: 'postcss', sourceMap: true, plugins: loader => [ require('autoprefixer')({ browsers: ['> 0.15% in CN'] }) // 添加前缀 ] } }, { loader: 'sass-loader', options: { sourceMap: true } } ] } ] } }; 样式表抽离成专门的单独文件并且设置版本号

    首先以下的 css 的处理我们都把 mode 设置为 production。

    webpack4 开始使用: mini-css-extract-plugin插件, 1-3 的版本可以用: extract-text-webpack-plugin

    抽取了样式,就不能再用 style-loader注入到 html 中了。

    npm install --save-dev mini-css-extract-plugin const path = require('path'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const devMode = process.env.NODE_ENV !== 'production'; // 判断当前环境是开发环境还是 部署环境,主要是 mode属性的设置值。 module.exports = { mode: 'development', entry: './src/index.js', output: { filename: 'main.js', path: path.resolve(__dirname, './dist') }, module: { rules: [ { test: /\.(sa|sc|c)ss$/, use: [ MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'sass-loader' ] } ] }, plugins: [ new MiniCssExtractPlugin({ filename: devMode ? '[name].css' : '[name].[hash].css', // 设置最终输出的文件名 chunkFilename: devMode ? '[id].css' : '[id].[hash].css' }) ] };

    再次运行打包:

    在 dist 目录中已经把 css 抽取到单独的一个 css 文件中了。修改 html,引入此 css 就能看到结果了。

    压缩 CSS

    webpack5 貌似会内置 css 的压缩,webpack4 可以自己设置一个插件即可。

    压缩 css 插件:optimize-css-assets-webpack-plugin

    安装

    npm i -D optimize-css-assets-webpack-plugin const path = require('path'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const autoprefixer = require('autoprefixer'); module.exports = { mode: 'production', entry: './src/index.js', output: { filename: 'main.[hash].js', path: path.resolve(__dirname, './dist') }, module: { rules: [ { test: /\.(sa|sc|c)ss$/, use: [ MiniCssExtractPlugin.loader, { loader: 'css-loader' }, { loader: 'postcss-loader', options: { ident: 'postcss', plugins: loader => [autoprefixer({ browsers: ['> 0.15% in CN'] })] } }, { loader: 'sass-loader' } ] } ] }, plugins: [ new MiniCssExtractPlugin({ filename: '[name][hash].css', chunkFilename: '[id][hash].css' }) ], optimization: { minimizer: [new OptimizeCSSAssetsPlugin({})] } }; JS 压缩

    压缩需要一个插件: uglifyjs-webpack-plugin, 此插件需要一个前提就是:mode: 'production'.

    安装

    npm i -D uglifyjs-webpack-plugin const path = require('path'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const autoprefixer = require('autoprefixer'); module.exports = { mode: 'production', entry: './src/index.js', output: { filename: 'main.[hash].js', path: path.resolve(__dirname, './dist') }, module: { rules: [ { test: /\.(sa|sc|c)ss$/, use: [ MiniCssExtractPlugin.loader, { loader: 'css-loader' }, { loader: 'postcss-loader', options: { ident: 'postcss', plugins: loader => [autoprefixer({ browsers: ['> 0.15% in CN'] })] } }, { loader: 'sass-loader' } ] } ] }, plugins: [ new MiniCssExtractPlugin({ filename: '[name][hash].css', chunkFilename: '[id][hash].css' }) ], optimization: { minimizer: [ new UglifyJsPlugin({ cache: true, parallel: true, sourceMap: true // set to true if you want JS source maps }), new OptimizeCSSAssetsPlugin({}) ] } }; 解决 CSS 文件或者 JS 文件名字哈希变化的问题

    HtmlWebpackPlugin插件,可以把打包后的 CSS 或者 JS 文件引用直接注入到 HTML 模板中,这样就不用每次手动修改文件引用了。

    安装

    npm install --save-dev html-webpack-plugin const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const autoprefixer = require('autoprefixer'); module.exports = { mode: 'production', entry: './src/index.js', output: { filename: 'main.[hash].js', path: path.resolve(__dirname, './dist') }, module: { rules: [ { test: /\.(sa|sc|c)ss$/, use: [ MiniCssExtractPlugin.loader, { loader: 'css-loader' }, { loader: 'postcss-loader', options: { ident: 'postcss', plugins: loader => [autoprefixer({ browsers: ['> 0.15% in CN'] })] } }, { loader: 'sass-loader' } ] } ] }, plugins: [ new MiniCssExtractPlugin({ filename: '[name][hash].css', chunkFilename: '[id][hash].css' }), new HtmlWebpackPlugin({ title: 'AICODER 全栈线下实习', // 默认值:Webpack App filename: 'main.html', // 默认值: 'index.html' template: path.resolve(__dirname, 'src/index.html'), minify: { collapseWhitespace: true, removeComments: true, removeAttributeQuotes: true // 移除属性的引号 } }) ], optimization: { minimizer: [ new UglifyJsPlugin({ cache: true, parallel: true, sourceMap: true // set to true if you want JS source maps }), new OptimizeCSSAssetsPlugin({}) ] } }; 清理 dist 目录

    每次构建,我们的 /dist 文件夹都会保存生成的文件,然后就会非常杂乱。

    通常,在每次构建前清理 /dist 文件夹,是比较推荐的做法

    clean-webpack-plugin 是一个比较普及的管理插件,让我们安装和配置下。

    npm install clean-webpack-plugin --save-dev

    webpack.config.js

    const path = require('path'); .... + const CleanWebpackPlugin = require('clean-webpack-plugin'); module.exports = { entry: { app: './src/index.js', print: './src/print.js' }, plugins: [ + new CleanWebpackPlugin(['dist']) ... ], output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist') } ... };

    现在执行 npm run build,再检查 /dist 文件夹。如果一切顺利,你现在应该不会再看到旧的文件,只有构建后生成的文件!

    加载图片与图片优化

    在 css 文件或者 sass 文件中添加如下代码

    $red: #900; $size: 20px; .box { height: 30px*2; font-size: $size; transform: translate3d( 0, 0, 0 ); + background: url('../static/1.jpeg') }

    运行打包发现如下错误:

    ERROR in ./src/static/1.jpeg 1:0 Module parse failed: Unexpected character '�' (1:0) You may need an appropriate loader to handle this file type.

    解决方案:file-loader处理文件的导入

    npm install --save-dev file-loader

    webpack.config.js

    const path = require('path'); module.exports = { entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] }, + { + test: /\.(png|svg|jpg|gif)$/, + use: [ + 'file-loader' + ] + } ] } };

    此时运行打包,发现 dist 目录多了一个图片文件,另外报错不再出现。

    那更进一步,图片如何进行优化呢?

    image-webpack-loader可以帮助我们对图片进行压缩和优化。

    npm install image-webpack-loader --save-dev

    使用:webpack.config.js

    const path = require('path'); module.exports = { entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] }, { test: /\.(png|svg|jpg|gif|jpeg|ico)$/, use: [ 'file-loader', + { + loader: 'image-webpack-loader', + options: { + mozjpeg: { + progressive: true, + quality: 65 + }, + optipng: { + enabled: false, + }, + pngquant: { + quality: '65-90', + speed: 4 + }, + gifsicle: { + interlaced: false, + }, + webp: { + quality: 75 + } + } + }, ] } ] } };

    此时在运行 webpack,发现会 生成的图片的大小会被压缩很多。

    更进一步处理图片成 base64

    url-loader功能类似于 file-loader,可以把 url 地址对应的文件,打包成 base64 的 DataURL,提高访问的效率。

    如何使用:

    npm install --save-dev url-loader

    webpack.config.js

    module.exports = { module: { rules: [ { test: /\.(png|svg|jpg|gif|jpeg|ico|woff|woff2|eot|ttf|otf)$/, use: [ { loader: 'url-loader', // 根据图片大小,把图片优化成base64 options: { limit: 10000 } }, { loader: 'image-webpack-loader', // 先进行图片优化 options: { mozjpeg: { progressive: true, quality: 65 }, optipng: { enabled: false }, pngquant: { quality: '65-90', speed: 4 }, gifsicle: { interlaced: false }, webp: { quality: 75 } } } ] } ] } }; 字体的处理(同图片)

    由于 css 中可能引用到自定义的字体,处理也是跟图片一致。

    const path = require('path'); module.exports = { entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] }, { test: /\.(png|svg|jpg|gif)$/, use: [ 'file-loader' ] }, + { + test: /\.(woff|woff2|eot|ttf|otf)$/, + use: [ + 'file-loader' + ] + } ] } }; 开发相关辅助js 使用 source map

    当 webpack 打包源代码时,可能会很难追踪到错误和警告在源代码中的原始位置。例如,如果将三个源文件(a.js, b.js 和 c.js)打包到一个 bundle(bundle.js)中,而其中一个源文件包含一个错误,那么堆栈跟踪就会简单地指向到 bundle.js。

    使用 inline-source-map 选项,这有助于解释说明 js 原始出错的位置。(不要用于生产环境):

    webpack.config.js

    const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const CleanWebpackPlugin = require('clean-webpack-plugin'); module.exports = { entry: { app: './src/index.js', print: './src/print.js' }, + devtool: 'inline-source-map', plugins: [ new CleanWebpackPlugin(['dist']), new HtmlWebpackPlugin({ title: 'Development' }) ], output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist') } };  inline-source-map监控文件变化,自动编译。使用观察模式

    每次修改完毕后,都手动编译异常痛苦。最简单解决的办法就是启动watch。

    npx webpack --watch

    当然可以添加到 npm 的 script 中

    package.json

    { "name": "development", "version": "1.0.0", "description": "", "main": "webpack.config.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", + "watch": "npx webpack --watch", "build": "npx webpack" }, "devDependencies": { "clean-webpack-plugin": "^0.1.16", "css-loader": "^0.28.4", "csv-loader": "^2.1.1", "file-loader": "^0.11.2", "html-webpack-plugin": "^2.29.0", "style-loader": "^0.18.2", "webpack": "^3.0.0", "xml-loader": "^1.2.1" } }

    但是有个 bug,就是每次我们修改 js 或者 css 文件后,要看到修改后的 html 的变化,需要我自己重新刷新页面。

    如何能不刷新页面,自动更新变化呢?

    使用 webpack-dev-server 和热更新

    webpack-dev-server 为你提供了一个简单的 web 服务器,并且能够实时重新加载(live reloading)。

    安装

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

    webpack.config.js

    const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const CleanWebpackPlugin = require('clean-webpack-plugin'); module.exports = { entry: { app: './src/index.js', print: './src/print.js' }, devtool: 'inline-source-map', + devServer: { + contentBase: './dist' + }, plugins: [ new CleanWebpackPlugin(['dist']), new HtmlWebpackPlugin({ title: 'Development' }) ], output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist') } };

    启动此 webserver:

    webpack-dev-server --open

    官网其他配置

    devServer: { clientLogLevel: 'warning', // 可能的值有 none, error, warning 或者 info(默认值) hot: true, // 启用 webpack 的模块热替换特性, 这个需要配合: webpack.HotModuleReplacementPlugin插件 contentBase: path.join(__dirname, "dist"), // 告诉服务器从哪里提供内容, 默认情况下,将使用当前工作目录作为提供内容的目录 compress: true, // 一切服务都启用gzip 压缩 host: '0.0.0.0', // 指定使用一个 host。默认是 localhost。如果你希望服务器外部可访问 0.0.0.0 port: 8080, // 端口 open: true, // 是否打开浏览器 overlay: { // 出现错误或者警告的时候,是否覆盖页面线上错误消息。 warnings: true, errors: true }, publicPath: '/', // 此路径下的打包文件可在浏览器中访问。 proxy: { // 设置代理 "/api": { // 访问api开头的请求,会跳转到 下面的target配置 target: "http://192.168.0.102:8080", pathRewrite: {"^/api" : "/mockjsdata/5/api"} } }, quiet: true, // necessary for FriendlyErrorsPlugin. 启用 quiet 后,除了初始启动信息之外的任何内容都不会被打印到控制台。这也意味着来自 webpack 的错误或警告在控制台不可见。 watchOptions: { // 监视文件相关的控制选项 poll: true, // webpack 使用文件系统(file system)获取文件改动的通知。在某些情况下,不会正常工作。例如,当使用 Network File System (NFS) 时。Vagrant 也有很多问题。在这些情况下,请使用轮询. poll: true。当然 poll也可以设置成毫秒数,比如: poll: 1000 ignored: /node_modules/, // 忽略监控的文件夹,正则 aggregateTimeout: 300 // 默认值,当第一个文件更改,会在重新构建前增加延迟 } }

    如何启用热更新呢?

    webpack.config.js

    const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const CleanWebpackPlugin = require('clean-webpack-plugin'); + const webpack = require('webpack'); module.exports = { entry: { app: './src/index.js' }, devtool: 'inline-source-map', devServer: { contentBase: './dist', + hot: true }, plugins: [ new CleanWebpackPlugin(['dist']), new HtmlWebpackPlugin({ title: 'Hot Module Replacement' }), + new webpack.NamedModulesPlugin(), // 更容易查看(patch)的依赖 + new webpack.HotModuleReplacementPlugin() // 替换插件 ], output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist') } }; JS启用babel转码

    虽然现代的浏览器已经兼容了96%以上的ES6的语法了,但是为了兼容老式的浏览器(IE8、9)我们需要把最新的ES6的语法转成ES5的。那么babel的loader就出场了。

    安装

    npm i -D babel-loader babel-core babel-preset-env

    用法

    在webpack的配置文件中,添加js的处理模块。

    module: { rules: [ { test: /\.js$/, exclude: /(node_modules)/, // 加快编译速度,不包含node_modules文件夹内容 use: { loader: 'babel-loader' } } ] }

    然后,在项目根目录下,添加babel的配置文件 .babelrc.

    .babelrc文件如下:

    { "presets": ["env"] }

    最后,在入口js文件中,添加ES6的❤新语法:

    class Temp { show() { console.log('this.Age :', this.Age); } get Age() { return this._age; } set Age(val) { this._age = val + 1; } } let t = new Temp(); t.Age = 19; t.show();

    最后打包:

    npx webpack

    最终打包后的js代码:

    var a = 1, b = 3, c = 9; console.log('a :', a); console.log('b :', b); console.log('c :', c); var Temp = function () { function Temp() { _classCallCheck(this, Temp); } _createClass(Temp, [{ key: 'show', value: function show() { console.log('this.Age :', this.Age); } }, { key: 'Age', get: function get() { return this._age; }, set: function set(val) { this._age = val + 1; } }]); return Temp; }(); var t = new Temp(); t.Age = 19; t.show(); Babel优化

    babel-loader可以配置如下几个options:

    cacheDirectory:默认值为 false。当有设置时,指定的目录将用来缓存 loader 的执行结果。之后的 webpack 构建,将会尝试读取缓存,来避免在每次执行时,可能产生的、高性能消耗的 Babel 重新编译过程(recompilation process)。如果设置了一个空值 (loader: 'babel-loader?cacheDirectory') 或者 true (loader: babel-loader?cacheDirectory=true),loader 将使用默认的缓存目录 node_modules/.cache/babel-loader,如果在任何根目录下都没有找到 node_modules 目录,将会降级回退到操作系统默认的临时文件目录。

    cacheIdentifier:默认是一个由 babel-core 版本号,babel-loader 版本号,.babelrc 文件内容(存在的情况下),环境变量 BABEL_ENV 的值(没有时降级到 NODE_ENV)组成的字符串。可以设置为一个自定义的值,在 identifier 改变后,强制缓存失效。

    forceEnv:默认将解析 BABEL_ENV 然后是 NODE_ENV。允许你在 loader 级别上覆盖 BABEL_ENV/NODE_ENV。对有不同 babel 配置的,客户端和服务端同构应用非常有用。

    注意:sourceMap 选项是被忽略的。当 webpack 配置了 sourceMap 时(通过 devtool 配置选项),将会自动生成 sourceMap。

    babel 在每个文件都插入了辅助代码,使代码体积过大.babel 对一些公共方法使用了非常小的辅助代码,比如 _extend。 默认情况下会被添加到每一个需要它的文件中。你可以引入 babel runtime 作为一个独立模块,来避免重复引入。

    安装:

    npm install babel-plugin-transform-runtime --save-dev npm install babel-runtime --save

    配置:

    webpack.config.js

    rules: [ // 'transform-runtime' 插件告诉 babel 要引用 runtime 来代替注入。 { test: /\.js$/, exclude: /(node_modules|bower_components)/, use: { loader: 'babel-loader', } } ]

    修改.babelrc

    { "presets": ["env"], "plugins": [ ["transform-runtime", { "helpers": true, "polyfill": true, "regenerator": true, "moduleName": "babel-runtime" }] ] }

    此时,webpack打包的时候,会自动优化重复引入公共方法的问题。

    ESLint校验代码格式规范

    安装

    npm install eslint --save-dev npm install eslint-loader --save-dev # 以下是用到的额外的需要安装的eslint的解释器、校验规则等 npm i -D babel-eslint standard

    使用

    // webpack.config.js module.exports = { // ... module: { rules: [ { test: /\.js$/, exclude: /node_modules/, loader: "eslint-loader", options: { // eslint options (if necessary) fix: true } }, ], }, // ... }

    eslint配置可以直接放到webpack的配置文件中,也可以直接放到项目根目录的 .eslintrc中文档

    // .eslintrc.js // https://eslint.org/docs/user-g... module.exports = { root: true, parserOptions: { parser: 'babel-eslint' }, env: { browser: true }, extends: [ // https://github.com/standard/st... 'standard' ], globals: { NODE_ENV: false }, rules: { // allow async-await 'generator-star-spacing': 'off', // allow debugger during development 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', // 添加,分号必须 semi: ['error', 'always'], 'no-unexpected-multiline': 'off', 'space-before-function-paren': ['error', 'never'], // 'quotes': ["error", "double", { "avoidEscape": true }] quotes: [ 'error', 'single', { avoidEscape: true } ] } };

    此时eslint的配置就结束了。

    到此为止,一个完整的开发阶段的webpack的配置文件const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const CleanWebpackPlugin = require('clean-webpack-plugin'); const autoprefixer = require('autoprefixer'); const webpack = require('webpack'); module.exports = { mode: 'development', entry: './src/index.js', output: { filename: 'main.js', path: path.resolve(__dirname, './dist') }, devtool: 'inline-source-map', devServer: { clientLogLevel: 'warning', // 可能的值有 none, error, warning 或者 info(默认值) hot: true, // 启用 webpack 的模块热替换特性, 这个需要配合: webpack.HotModuleReplacementPlugin插件 contentBase: path.join(__dirname, "dist"), // 告诉服务器从哪里提供内容, 默认情况下,将使用当前工作目录作为提供内容的目录 compress: true, // 一切服务都启用gzip 压缩 host: '0.0.0.0', // 指定使用一个 host。默认是 localhost。如果你希望服务器外部可访问 0.0.0.0 port: 8085, // 端口 open: true, // 是否打开浏览器 overlay: { // 出现错误或者警告的时候,是否覆盖页面线上错误消息。 warnings: true, errors: true }, publicPath: '/', // 此路径下的打包文件可在浏览器中访问。 proxy: { // 设置代理 "/api": { // 访问api开头的请求,会跳转到 下面的target配置 target: "http://192.168.0.102:8080", pathRewrite: { "^/api": "/mockjsdata/5/api" } } }, quiet: true, // necessary for FriendlyErrorsPlugin. 启用 quiet 后,除了初始启动信息之外的任何内容都不会被打印到控制台。这也意味着来自 webpack 的错误或警告在控制台不可见。 watchOptions: { // 监视文件相关的控制选项 poll: true, // webpack 使用文件系统(file system)获取文件改动的通知。在某些情况下,不会正常工作。例如,当使用 Network File System (NFS) 时。Vagrant 也有很多问题。在这些情况下,请使用轮询. poll: true。当然 poll也可以设置成毫秒数,比如: poll: 1000 ignored: /node_modules/, // 忽略监控的文件夹,正则 aggregateTimeout: 300 // 默认值,当第一个文件更改,会在重新构建前增加延迟 } }, module: { rules: [ { test: /\.js$/, exclude: /(node_modules)/, // 加快编译速度,不包含node_modules文件夹内容 use: [{ loader: 'babel-loader' },{ loader: 'eslint-loader', options: { fix: true } }] }, { test: /\.(sa|sc|c)ss$/, use: [ 'style-loader', { loader: 'css-loader', options: { sourceMap: true } }, { loader: 'postcss-loader', options: { ident: 'postcss', sourceMap: true, plugins: (loader) => [autoprefixer({browsers: ['> 0.15% in CN']})] } }, { loader: 'sass-loader', options: { sourceMap: true } } ] }, { test: /\.(woff|woff2|eot|ttf|otf)$/, use: [ { loader: 'url-loader', options: { limit: 10000 } } ] }, { test: /\.(png|svg|jpg|gif|jpeg|ico)$/, use: [ { loader: 'url-loader', options: { limit: 10000 } }, { loader: 'image-webpack-loader', options: { mozjpeg: { progressive: true, quality: 65 }, optipng: { enabled: false }, pngquant: { quality: '65-90', speed: 4 }, gifsicle: { interlaced: false }, webp: { quality: 75 } } } ] } ] }, plugins: [ new MiniCssExtractPlugin({filename: '[name].css', chunkFilename: '[id].css'}), new CleanWebpackPlugin(['dist']), new webpack.NamedModulesPlugin(), // 更容易查看(patch)的依赖 new webpack.HotModuleReplacementPlugin(), // 替换插件 new HtmlWebpackPlugin({ title: 'AICODER 全栈线下实习', // 默认值:Webpack App filename: 'index.html', // 默认值: 'index.html' minify: { collapseWhitespace: true, removeComments: true, removeAttributeQuotes: true, // 移除属性的引号 }, template: path.resolve(__dirname, 'src/index.html') }) ], optimization: {} };

    用于生产环境的配置

    const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); const CleanWebpackPlugin = require('clean-webpack-plugin'); const autoprefixer = require('autoprefixer'); module.exports = { mode: 'production', entry: './src/index.js', output: { filename: 'main.[hash].js', path: path.resolve(__dirname, './dist') }, module: { rules: [ { test: /\.js$/, exclude: /(node_modules)/, // 加快编译速度,不包含node_modules文件夹内容 use: [{ loader: 'babel-loader' },{ loader: 'eslint-loader', options: { fix: true } }] }, { test: /\.(sa|sc|c)ss$/, use: [ MiniCssExtractPlugin.loader, { loader: 'css-loader' }, { loader: 'postcss-loader', options: { ident: 'postcss', plugins: (loader) => [autoprefixer({browsers: ['> 0.15% in CN']})] } }, { loader: 'sass-loader' } ] }, { test: /\.(woff|woff2|eot|ttf|otf)$/, use: [ { loader: 'url-loader', options: { limit: 10000 } } ] }, { test: /\.(png|svg|jpg|gif|jpeg|ico)$/, use: [ 'file-loader', { loader: 'image-webpack-loader', options: { mozjpeg: { progressive: true, quality: 65 }, optipng: { enabled: false }, pngquant: { quality: '65-90', speed: 4 }, gifsicle: { interlaced: false }, webp: { quality: 75 } } } ] } ] }, plugins: [ new MiniCssExtractPlugin({filename: '[name][hash].css', chunkFilename: '[id][hash].css'}), new CleanWebpackPlugin(['dist']), new HtmlWebpackPlugin({ title: 'AICODER 全栈线下实习', // 默认值:Webpack App filename: 'index.html', // 默认值: 'index.html' template: path.resolve(__dirname, 'src/index.html'), minify: { collapseWhitespace: true, removeComments: true, removeAttributeQuotes: true, // 移除属性的引号 } }) ], optimization: { minimizer: [ new UglifyJsPlugin({ cache: true, parallel: true, sourceMap: true // set to true if you want JS source maps }), new OptimizeCSSAssetsPlugin({}) ] } }; 相关的loader列表

    webpack 可以使用 loader 来预处理文件。这允许你打包除 JavaScript 之外的任何静态资源。你可以使用 Node.js 来很简单地编写自己的 loader。

    文件raw-loader 加载文件原始内容(utf-8)val-loader 将代码作为模块执行,并将 exports 转为 JS 代码url-loader 像 file loader 一样工作,但如果文件小于限制,可以返回 data URLfile-loader 将文件发送到输出文件夹,并返回(相对)URLJSONjson-loader 加载 JSON 文件(默认包含)json5-loader 加载和转译 JSON 5 文件cson-loader 加载和转译 CSON 文件转换编译(Transpiling)script-loader 在全局上下文中执行一次 JavaScript 文件(如在 script 标签),不需要解析babel-loader 加载 ES2015+ 代码,然后使用 Babel 转译为 ES5buble-loader 使用 Bublé 加载 ES2015+ 代码,并且将代码转译为 ES5traceur-loader 加载 ES2015+ 代码,然后使用 Traceur 转译为 ES5ts-loader 或 awesome-typescript-loader 像 JavaScript 一样加载 TypeScript 2.0+coffee-loader 像 JavaScript 一样加载 CoffeeScript模板(Templating)html-loader 导出 HTML 为字符串,需要引用静态资源pug-loader 加载 Pug 模板并返回一个函数jade-loader 加载 Jade 模板并返回一个函数markdown-loader 将 Markdown 转译为 HTMLreact-markdown-loader 使用 markdown-parse parser(解析器) 将 Markdown 编译为 React 组件posthtml-loader 使用 PostHTML 加载并转换 HTML 文件handlebars-loader 将 Handlebars 转移为 HTMLmarkup-inline-loader 将内联的 SVG/MathML 文件转换为 HTML。在应用于图标字体,或将 CSS 动画应用于 SVG 时非常有用。样式style-loader 将模块的导出作为样式添加到 DOM 中css-loader 解析 CSS 文件后,使用 import 加载,并且返回 CSS 代码less-loader 加载和转译 LESS 文件sass-loader 加载和转译 SASS/SCSS 文件postcss-loader 使用 PostCSS 加载和转译 CSS/SSS 文件stylus-loader 加载和转译 Stylus 文件清理和测试(Linting && Testing)mocha-loader 使用 mocha 测试(浏览器/NodeJS)eslint-loader PreLoader,使用 ESLint 清理代码jshint-loader PreLoader,使用 JSHint 清理代码jscs-loader PreLoader,使用 JSCS 检查代码样式coverjs-loader PreLoader,使用 CoverJS 确定测试覆盖率框架(Frameworks)vue-loader 加载和转译 Vue 组件polymer-loader 使用选择预处理器(preprocessor)处理,并且 require() 类似一等模块(first-class)的 Web 组件angular2-template-loader 加载和转译 Angular 组件Awesome 更多第三方 loader,查看 awesome-webpack 列表other

    webpack还是有很多其他需要学习的内容。 请参考官网,或者研究一下vue-cli的生成的webpack的相关配置,也很值得学习。

    另外其他脚手架生成的相关配置都可以研究一下比如:create-react-app、yo等

    转载:https://www.cnblogs.com/fly_dragon/p/9397919.html

  • Vue 84 0 1 发布

    8.1. 前置知识学习npm 学习官方文档推荐资料npm入门npm介绍需要了解的知识点

    package.json

    文件相关配置选项

    npm 本地安装、全局安装、本地开发安装等区别及相关命令

    npm script脚步的基本编写能力

    有时间专门写一个这样的专题,如果需要可以邮件我。malun666@126.com

    webpack基础学习

    官方文档Webpack了解的知识点:webpack的基本配置了解webpack常用的loader: less-loader、sass-loader、 vue-loader、style-loader、css-loader、eslint-loader、babel-loader等熟悉Webpack的webpack-dev-server的基本配置和使用,会配置热更新

    es6语法学习

    阮一峰老师的大作《ECMAScript 6 入门》需要学习的知识点es6的模块机制各种最新语法糖,简写、geter、setter、箭头函数类、继承的心机制 ...

    nodejs基础知识

    知识点学习:文件操作http服务express

    组件化开发思想

    8.2. Vue脚手架工具:vue-cli构建实战项目

    其实如果编写Vue的前端项目,直接使用vue的官方vue-cli构建工具最好用,一个命令就可以直接生成项目的结构和目录。 而且官方需要依赖的包也可以自动配置好,只需要npm instal一下,然后就可以开发测试了。

    8.2.1. vue-cli安装# 安装vue-cli。 安装之前首先确保你已经安装好了nodejs 而且打开命令行 $ npm install -g vue-cli # 校验一下是否安装成功 $ vue -V #=> 2.5.1 我当前的版本是这个,你的可能比这个新 8.2.2. 使用vue-cli初始化项目

    通过以下命令的方式可以创建一个项目文件夹,并初始化对应的文件。

    $ vue init <template-name> <project-name>

    其中template-name可以取以下值,每个值对应不同的项目构建的模板。

    webpack--全功能的Webpack + vueify,包括热加载,静态检测,单元测试webpack-simple--一个简易的Webpack + vueify,以便于快速开始。browserify--全功能的Browserify + vueify,包括热加载,静态检测,单元测试browserify-simple--一个简易的Browserify + vueify,以便于快速开始。

    安装和开发控制台的命令:

    # 如果已经安装,请省略 $ npm install -g vue-cli # 初始化一个webpack全功能包的vue项目,请您把my-project换成你自己的项目名。 $ vue init webpack my-project # 用命令行进入当前项目目录 $ cd my-project # npm安装所有的依赖的包 $ npm install # 运行测试的首页 $ npm run dev 8.2.3. 综合实例开发记录通过vue-cli构建工具初始化项目目录

    安装过程,控制台会问你项目名称是什么?项目描述?项目作者,是否使用eslint校验,是否使用单元测试等....

    我的安装过程如下请参考:

    $ vue init webpack ttl # => 安装webpack模板的项目 ttl(项目名可以随便取) A newer version of vue-cli is available. latest: 2.6.0 installed: 2.5.1 This will install Vue 2.x version of template. For Vue 1.x use: vue init webpack#1.0 ttl ? Project name mydemovue # => 项目名称 ? Project description A Vue.js project # => 项目描述 ? Author malun <malun666@126.com> # => 作者 ? Vue build standalone # => 是否支持单文件组件 ? Use ESLint to lint your code? Yes # => 是否支持ESLint代码校验 ? Pick an ESLint preset Standard # => 校验的标准是什么? ? Setup unit tests with Karma + Mocha? Yes # => 是否使用单元测试 ? Setup e2e tests with Nightwatch? Yes # => 是否使用e2e测试 vue-cli · Generated "ttl". To get started: cd ttl npm install npm run dev Documentation can be found at https://vuejs-templates.github...

    通过上面一系列的命令后,我们就会创建一个webpack配置好的项目包。目录结构如下:

    ttl |--.babelrc #=> babel的配置文件,主要用于转换es6等最新的js语法。 |--.editorconfig #=> 编辑器配置 |--.eslintignore #=> eslint的忽略校验的配置文件 |--.eslintrc.js #=> eslint的配置校验js是否规范的配置文件 |--.gitignore #=> 设置git忽略的管理的文件 |--README.md #=> readme说明文件 |--build/ #=> 自动构建存放的文件地方 |--config/ #=> 当前开发、测试等配置的文件,需要懂点nodejs了啊。 |--index.html #=> 项目的主入口的模板 |--package.json #=> npm的配置文件 |--src/ #=> 源码目录 |--static/ #=> 静态资源存放的目录 |--test/ #=> 测试相关目录 初始化依赖包$ cd ttl #=> 进入上面创建好的项目目录 $ npm install #=> 安装所有的依赖包。 安装过程可能非常长,网络也可能有问题,请耐心等待。 # 安装完成后,可以直接运行测试,如果自动打开浏览器,并跳转到http://localhost:8080/ 说明一切都ok了。 $ npm run dev

    npm 安装的时候经常网会断开,国内的网(哎,说多了都是泪)你懂的。最好能科学上网,或者是用淘宝的npm的镜像

    安装vue-router组件$ npm i -S vue-router

    到项目的

    /src/components/

    目录下创建三个组件文件。

    分别是:

    首页组件

    <template> <div class="home"> <h3>{{ msg }}</h3> </div> </template> <script> export default { name: 'home', // 组件可以有自己的名字。 data () { // 组件的data必须是函数 return { msg: '这里是Home视图' } } } </script> <style scoped> h3 { background-color: #82c; } </style>

    用户首页组件

    <template> <div> <h3>{{ msg }}</h3> </div> </template> <script> export default { // es6的模块导出定义语法,此模块导出默认的对象 name: 'user', // 组件可以有自己的名字。 data () { // 组件的data必须是函数 return { msg: '这里是User视图' } } } </script> <style scoped> h3 { background-color: red; } </style>

    产品组件

    <template> <div class="product"> <h3>{{ msg }}</h3> </div> </template> <script> export default { name: 'product', // 组件可以有自己的名字。 data () { // 组件的data必须是函数 return { msg: '这里是Home视图' } } } </script> <style scoped> h3 { background-color: green; } </style>

    项目的目录结构为:

    ttl |-- src |--|-- Hello.vue |--|-- Home.vue |--|-- Product.vue |--|-- User.vue 创建router对象及配置路由

    在src目录下创建approuter.js文件。 然后添加如下代码:

    import VueRouter from 'vue-router' // 导入路由模块 import Home from './components/Home.vue' // 导入Home组件 import User from './components/User.vue' import Product from './components/Product.vue' export default new VueRouter({ // 定义路由规则对象 routes: [ {path: '/home', component: Home}, {path: '/user/:id', component: User}, {path: '/product/:id', component: Product} ] }) 修改main.js文件 找到src/目录下的main.js文件, 共修改4处,添加路由引用、添加路由规则对象导入、启用路由、将路由键入到Vue中。
    修改此文件为:// The Vue build version to load with the `import` command // (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from 'vue' import App from './App' import VueRouter from 'vue-router' // +++1、导入路由组件 import router from './approuter' // +++2、导入我们自己写的路由配置文件 // +++ 3、使用路由组件 Vue.use(VueRouter) /* eslint-disable no-new */ new Vue({ el: '#app', template: '<App/>', components: { App }, router: router // +++4、添加路由对象 }) 在app.vue中添加路由导航

    最终代码如下:

    <template> <div id="app"> <nav class="top-menu"> <ul > <li v-for="item in menuList"> <router-link :to="item.url">{{ item.name }}</router-link> </li> </ul> </nav> <hr> <div> <router-view></router-view> </div> </div> </template> <script> export default { name: 'app', data: function () { return { menuList: [ { name: '首页', url: '/home' }, { name: '用户', url: '/user/19' }, { name: '产品', url: '/product/20' } ] } } } </script> <style> #app { } .top-menu ul, .top-menu li { list-style: none; } .top-menu { overflow: hidden; } .top-menu li { float: left; width: 100px; } </style>  

    刷新一下浏览器,你将会看到最终的运行结果。


    转载:https://www.cnblogs.com/fly_dr...

    作者:老马

  • Vue 62 0 1 发布

    7.1. Vue-router的版本对应

    注意: vue-router@2.x 只适用于 Vue 2.x 版本。 vue-router@1.x 对应于Vue1.x版本。

    的Github地址:vue-router文档地址7.2. vue-router的安装使用CDN连接方式

    https://unpkg.com/vue-router/dist/vue-router.js

    npm 安装npm install vue-router 7.3. vue-router 入门demo

    vue-router开发的步骤:

    第一步: 引入vue和vue-router包。

    可以使用cdn的方式或者npm的方式。如果配合npm和webpack的话可以直接作为一个模块导入即可。但是作为初学入门的话建议还是 直接使用cdn包的形式,先学会怎么用路由。

    <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

    第二步: 定义路由跳转的组件

    // 1\. 定义(路由)组件。 const Foo = { template: '<div>foo</div>' } const Bar = { template: '<div>bar</div>' }

    第三步: 定义路由规则对象

    // 每个路由path应该映射一个组件。 其中"component" 可以是 // 通过 Vue.extend() 创建的组件构造器, // 或者,只是一个组件配置对象。 const routes = [ { path: '/foo', component: Foo }, { path: '/bar', component: Bar } ] // 创建路由对象 const router = new VueRouter({ routes // (缩写)相当于 routes: routes,es6的新语法 }) 第四步: 创建Vue对象,并加重上面创建的路由对象// 记得要通过 router 配置参数注入路由, // 从而让整个应用都有路由功能 const app = new Vue({ router }).$mount('#app') 第五步: 在模板中编写路由跳转链接<div id="app"> <h1>Hello App!</h1> <p> <!-- 使用 router-link 组件来导航. --> <!-- 通过传入 `to` 属性指定链接. --> <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 --> <router-link to="/foo">Go to Foo</router-link> <router-link to="/bar">Go to Bar</router-link> </p> <!-- 路由出口 --> <!-- 路由匹配到的组件将渲染在这里 --> <router-view></router-view> </div>

    最终的代码:

    <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script> <div id="app"> <h1>Hello App!</h1> <p> <!-- 使用 router-link 组件来导航. --> <!-- 通过传入 `to` 属性指定链接. --> <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 --> <router-link to="/foo">Go to Foo</router-link> <router-link to="/bar">Go to Bar</router-link> </p> <!-- 路由出口 --> <!-- 路由匹配到的组件将渲染在这里 --> <router-view></router-view> </div> <script> // 1\. 定义(路由)组件。 // 可以从其他文件 import 进来 const Foo = { template: '<div>foo</div>' } const Bar = { template: '<div>bar</div>' } // 2\. 定义路由 const routes = [ { path: '/foo', component: Foo }, { path: '/bar', component: Bar } ] // 3\. 创建 router 实例,然后传 `routes` 配置 // 你还可以传别的配置参数, 不过先这么简单着吧。 const router = new VueRouter({ routes // (缩写)相当于 routes: routes }) // 4\. 创建和挂载根实例。 // 记得要通过 router 配置参数注入路由, // 从而让整个应用都有路由功能 const app = new Vue({ router }).$mount('#app') </script> 7.4. 使用vue-router的综合实例

    下面是一个综合的例子, 页面上有几个导航的按钮,然后通过点击不同的按钮,可以在当前页面切换不同的组件。

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之extend全局方法</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script> <style> ul, li { list-style: none; } ul { overflow: hidden; } li { float: left; width: 100px; } h2 { background-color: #903;} </style> </head> <body> <div id="app"> <top-bar> </top-bar> <hr> <p>email to: {{ email }}</p> <hr> <router-view class="view one"></router-view> <footer-bar></footer-bar> </div> <script> var topbarTemp = ` <nav> <ul> <li v-for="item in NavList"> <router-link :to="item.url">{{ item.name }}</router-link> </li> </ul> </nav> `; // 定义组件:topbar Vue.component('top-bar', { template: topbarTemp, data: function () { return { NavList: [ { name: '首页', url: '/home'}, { name: '产品', url: '/product'}, { name: '服务', url: '/service'}, { name: '关于', url: '/about'} ] } } }); Vue.component('footer-bar', { // 定义组件 footerbar template: ` <footer> <hr/> <p>版权所有@flydragon<p> </footer> ` }); // 创建home模块 var home = { template: `<div> <h2>{{ msg }}<h2></div>`, data: function () { return { msg: 'this is home view' } } }; // 创建product 模块 var product = { template: `<div> {{ msg }}</div>`, data: function () { return { msg: 'this is product view' } } } // 定义路由对象 var router = new VueRouter({ routes: [ { path: '/home', component: home }, { path: '/product', component: product } ] }); // 初始化一个Vue实例 var app = new Vue({ el: '#app', data: { email: 'flydragon@gmail.com' }, router: router }); </script> </body> </html> 7.5. 路由参数获取

    定义路由路径的时候,可以指定参数。参数需要通过路径进行标识:/user/:id就是定义了一个规则,/user开头,然后后面的就是id参数的值。 比如:

    路由规则: /user/:id /user/9 => id = 9 /user/8 => id = 8 /user/1 => id = 1

    然后在跳转后的vue中可以通过this.$route.params.参数名获取对应的参数。 比如代码:

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之extend全局方法</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script> </head> <body> <div id="app"> <nav> <router-link to="/user/9">用户</router-link> <router-link to="/stu/malun">学生</router-link> <hr> </nav> <router-view></router-view> </div> <script> var user = { template: ` <div>user id is : {{ $route.params.id }}</div> ` }; var stu = { template: ` <div> <h2>{{ getName }}</h2> </div> `, computed: { getName: function () { return this.$route.params.name; } } }; var router = new VueRouter({ routes: [ { path: '/user/:id', component: user }, { path: '/stu/:name', component: stu } ] }); var app = new Vue({ el: '#app', router: router }); </script> </body> </html> 7.6. js控制路由跳转

    上面我们演示的都是通过router-link进行跳转。 其实我们还可以通过js编程的方式进行路由的跳转。

    // 当前路由的view跳转到 /home router.push('home') // 对象, 跳转到/home router.push({ path: 'home' }) // 命名的路由 router.push({ name: 'user', params: { userId: 123 }}) // 带查询参数,变成 /register?plan=private router.push({ path: 'register', query: { plan: 'private' }}) 7.7. 嵌套路由

    嵌套路由跟普通路由基本没有什么区别。但是可以让vue开发变的非常灵活。 官网这块写的也非常好,我就直接拷贝了(原谅我吧。) 实际生活中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL 中各段动态路径也按某种结构对应嵌套的各层组件,例如:

    /user/foo/profile /user/foo/posts +------------------+ +-----------------+ | User | | User | | +--------------+ | | +-------------+ | | | Profile | | +------------> | | Posts | | | | | | | | | | | +--------------+ | | +-------------+ | +------------------+ +-----------------+ 借助 vue-router,使用嵌套路由配置,就可以很简单地表达这种关系。 <div id="app"> <router-view></router-view> </div> const User = { template: '<div>User {{ $route.params.id }}</div>' } const router = new VueRouter({ routes: [ { path: '/user/:id', component: User } ] }) 这里的 <router-view> 是最顶层的出口,渲染最高级路由匹配到的组件。同样地,一个被渲染组件同样可以包含自己的嵌套 <router-view>。例如,在 User 组件的模板添加一个 <router-view>: const User = { template: ` <div class="user"> <h2>User {{ $route.params.id }}</h2> <router-view></router-view> </div> ` } 要在嵌套的出口中渲染组件,需要在 VueRouter 的参数中使用 children 配置: const router = new VueRouter({ routes: [ { path: '/user/:id', component: User, children: [ { // 当 /user/:id/profile 匹配成功, // UserProfile 会被渲染在 User 的 <router-view> 中 path: 'profile', component: UserProfile }, { // 当 /user/:id/posts 匹配成功 // UserPosts 会被渲染在 User 的 <router-view> 中 path: 'posts', component: UserPosts } ] } ] })

    要注意,以 / 开头的嵌套路径会被当作根路径。 这让你充分的使用嵌套组件而无须设置嵌套的路径。 你会发现,children 配置就是像 routes 配置一样的路由配置数组,所以呢,你可以嵌套多层路由。

    此时,基于上面的配置,当你访问 /user/foo 时,User 的出口是不会渲染任何东西,这是因为没有匹配到合适的子路由。如果你想要渲染点什么,可以提供一个 空的 子路由:

    const router = new VueRouter({ routes: [ { path: '/user/:id', component: User, children: [ // 当 /user/:id 匹配成功, // UserHome 会被渲染在 User 的 <router-view> 中 { path: '', component: UserHome }, // ...其他子路由 ] } ] })

    转载:https://www.cnblogs.com/fly_dr...

    作者:老马

  • Vue 54 0 1 发布

    组件其实就是一个拥有样式、动画、js逻辑、HTML结构的综合块。前端组件化确实让大的前端团队更高效的开发前端项目。而作为前端比较流行的框架之一,Vue的组件和也做的非常彻底,而且有自己的特色。尤其是她单文件组件开发的方式更是非常方便,而且第三方工具支持也非常丰富,社区也非常活跃,第三方组件也呈井喷之势。当然学习和使用Vue的组件也是我们的最重要的目标。

    6.1. 全局扩展方法Vue.extend

    Vue提供了一个全局的API,Vue.extend可以帮助我们对Vue实例进行扩展,扩展完了之后,就可以用此扩展对象创建新的Vue实例了。 类似于继承的方式。

    语法:Vue.extend( options ) 参数: {Object} options 用法: 使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象[后面会细讲]。 data 选项是特例,需要注意 - 在 Vue.extend() 中它必须是函数

    下面是一个官网demo:

    <div id="mount-point"></div> <script> // 创建构造器 var Profile = Vue.extend({ // 新的对象的模板,所有子实例都会拥有此模板 template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>', data: function () { // 创建的Vue实例时,data可以是Object 也可以是Function,但是在扩展 return { // 的时候,data必须是一个函数,而且要返回值奥。 firstName: 'Walter', lastName: 'White', alias: 'Heisenberg' } } }) </script> // 创建 Profile 实例,并挂载到一个元素上。 new Profile().$mount('#mount-point') // .$mount() 方法跟设置 el属性效果是一致的。

    结果如下:

    <p>Walter White aka Heisenberg</p>

    综合案例代码:

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之extend全局方法</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="app"> </div> <script> var myVue = Vue.extend({ template: '<div>{{ name }} - {{ age }} - {{ mail }}</div>', data: function () { return { name: 'malun', age: '19', mail: 'flydragonml@gmail.com' }; } }); var app = new myVue({ el: '#app' }); </script> </body> </html> 6.2. 创建组件和注册组件

    当然上面的方式只是能让我们继承Vue实例做一些扩展的动作。看Vue中如何创建一个组件并注册使用。

    Vue提供了一个全局注册组件的方法:Vue.component。

    语法: Vue.component( id, [definition] ) 参数: {string} id 组件的名字,可以当HTML标签用,注意组件的名字都是小写,而且最好有横线和字母组合。 {Function | Object} [definition] 组件的设置 用法: 注册或获取全局组件。注册还会自动使用给定的id设置组件的名称 // 注册组件,传入一个扩展过的构造器 Vue.component('my-component', Vue.extend({ /* ... */ })) // 注册组件,传入一个选项对象(自动调用 Vue.extend) Vue.component('my-component', { /* ... */ }) // 获取注册的组件(始终返回构造器) var MyComponent = Vue.component('my-component')

    简单demo:

    <div id="example"> <!--组件直接跟普通的标签一样的使用。--> <my-component></my-component> </div> // 注册一个组件 Vue.component('my-component', { // 模板选项设置当前组件,最终输出的html模板。注意:有且只有一个根元素。 template: '<div>A custom component!</div>' }) // 创建根实例 new Vue({ el: '#example' })

    那么我们注册一个组件自动帮我生成 label和radiobutton组合。

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之extend全局方法</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="app"> <!--组件名直接可以当标签使用。--> <radio-tag rid="rBas" txt="篮球" val="1"></radio-tag> <!--组件的属性也可以使用Vue的绑定的语法,下面是动态绑定数据给子组件--> <radio-tag :rid="demoId" :txt="demoText" :val="demoVal"></radio-tag> </div> <script> // 定义组件模板,模板必须有且只有一个根元素。 var temp = '<div><label v-bind:for="rid">{{ txt }}</label><input :id="rid" type="radio" v-bind:value="val"></div>'; // 注册一个全局的组件 Vue.component('radio-tag', { // 组件的名字不能有大写字母,跟React的曲别啊。另外组件名最好是小写字母加横线组合。 template: temp, props: ['rid', 'txt', 'val'], // 设置组件的属性有哪些,定义标签的属性一致。 data: function () { // 注意属性名都得是小写,不然会不认的。 return { // 在组件的定义中data必须是函数,而且必须有返回值。 age: 19, // 此地方的 age 和 emial都是演示,并么有有到。 email: 'flydragonml@gmail.com' } } }); // 初始化一个Vue实例 var app = new Vue({ el: '#app', data: { demoId: 'ft', demoText: '足球', demoVal: 2 } }); </script> </body> </html>组件的名字都必须是小写【其实是非必须,但是为了不麻烦就强制吧】!!!而且建议是小写字母和横线的组合比如: my-radiobtn注册组件的时候,可以传入一个选项对象进行配置。其中props是设置当前组件的属性,属性也都必须小写。属性是连接父容器和子组件的桥梁。注意:属性名和组件的名字都要小写啊,不然vue不会认的。编写组件代码最好配合Vue的chrome插件:vue-devtool组件可以返还自己的数据,但是必须是函数。data必须是Function6.3. 局部注册组件

    全局注册组件就是使用全局API

    Vue.componet(id, {....})就行了,当然我们有时候需要注册一个局部模块的自己用的组件。那么就可以用下面的方式了。

    var Child = { template: '<div>A custom component!</div>' } new Vue({ // ... components: { // <my-component> 将只在父模板可用 'my-component': Child } }) 6.4. 组件的slot

    使用组件的时候,经常需要在父组件中为子组件中插入一些标签等。当然其实可以通过属性等操作,但是比较麻烦,直接写标签还是方便很多。 那么Vue提供了slot协助子组件对父容器写入的标签进行管理。

    当父容器写了额外的内容时, 如果子组件恰好有一个slot标签,那边子容器的slot标签会被父容器写入的内容替换掉。

    比如下面的例子:

    <!DOCTYPE html> <<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之extend全局方法</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="app"> <!--父容器输入标签--> <my-slot> <h3>这里是父容器写入的</h3> </my-slot> <!--父容器绑定数据到子容器的slot,这里的作用域是父容器的啊。--> <my-slot>{{ email }}</my-slot> <!--父容器什么都不传内容--> <my-slot></my-slot> </div> <script> // 反引号:可以定义多行字符串。 var temp = ` <div> <h1>这里是子组件</h1> <hr> <slot>slot标签会被父容器写的额外的内容替换掉,如果父容器没有写入任何东西,此标签将保留!</slot> </div> `; Vue.component('MySlot', { // 如果定义的组件为MySlot,那么用组件的时候:<my-slot></my-slot> template: temp, }); // 初始化一个Vue实例 var app = new Vue({ el: '#app', data: { email: 'flydragon@gmail.com' } }); </script> </body> </html>

    最终结果:

    <div id="app"> <div> <h1>这里是子组件</h1> <hr> <h3>这里是父容器写入的</h3> </div> <div> <h1>这里是子组件</h1> <hr> flydragon@gmail.com </div> <div> <h1>这里是子组件</h1> <hr> slot标签会被父容器写的额外的内容替换掉,如果父容器没有写入任何东西,此标签将删除! </div> </div> 6.5. 单文件组件的使用方式介绍

    通过上面我们定义组件的方式,就已经感觉很不爽了,尤其是模板的定义,而且样式怎么处理也没有很好的进行规整。 Vue可以通过Webpack等第三方工具实现单文件的开发的方式。当然这里会牵扯到很多es6的语法、第三方工具实现前端模块化等很多知识, 我们大概看一眼指导Vue的组件可以直接写一个文件中,其他地方就可以直接导入这个模块了。后面做项目的时候我还会再讲一下怎么用。

    <template> <div> <nav class="navbar navbar-dark navbar-fixed-top"> </nav> <div class="col-md-3 sidebar"> <ul> <li v-for="item in list" > <router-link :to="{ path: item.url }">{{ item.name }}</router-link> </li> </ul> </div> <div class="container-fluid content"> <router-view></router-view> </div> </div> </div> </template> <script> // 这里怎么回事 import Axios from 'axios' export default { name: 'app', components: { }, data: function () { return { list: [] } }, mounted: function () { // 挂在完成后 this.$nextTick(function () { Axios.get('/api/menulist', { params: { } }).then(function (res) { this.list = res.data }.bind(this)) }) } } </script> <style> ul, li { list-style: none; } .router-link-active { background-color: #f6f6f6; } .navbar { height: 50px; background-color: #303030; } .content { margin-top: 50px; padding-left: 210px; } .sidebar { background-color: #f5f5f5; border-right: 1px solid #eee; width: 200px; } @media (min-width: 768px) { .sidebar { position: fixed; top: 51px; bottom: 0; left: 0; z-index: 1000; display: block; padding: 20px; overflow-x: hidden; overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */ background-color: #f5f5f5; border-right: 1px solid #eee; } } </style>6.6. 组件总结

    Vue的组件化还是做的比较彻底的。不像Angular1.0中的模块那么鸡肋。组件化确实让前端模块化开发更加容易实现, Vue的单文件开发组件的方式也是Vue的一大创新,也发非常好用。

    转载:https://www.cnblogs.com/fly_dr...

    作者:老马

  • Vue 64 0 1 发布

    Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理、数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成、编译、挂着、销毁等过程进行js控制。

    5.1. Vue实例初始化的选项配置对象详解

    前面我们已经用了很多次 new Vue({...})的代码,而且Vue初始化的选项都已经用了data、methods、el、computedd等,估计您看到这里时,应该已经都明白了他们的作用,我们就详细讲解一下他们的使用情况。更详细的请参考官网内容

    5.1.1. Vue实例的的data对象介绍

    Vue的实例的数据对象data 我们已经用了很多了,数据绑定离不开data里面的数据。也是Vue的核心属性。 它是Vue绑定数据到HTML标签的数据源泉,另外Vue框架会自动监视data里面的数据变化,自动更新数据到HTML标签上去。本质原理是:Vue会自动将data里面的数据进行递归抓换成getter和setter,然后就可以自动更新HTML标签了,当然用getter和setter所以老的浏览器Vue支持的不够好。

    data对象的类型:

    类型是Object或者Function。如果是组件对象中,data必须是Function类型。【后面学了组件后就明白了,暂时对组件先放放。】

    实例:

    // 创建普通的Vue实例 var vm = new Vue({ data: data }) // 组件定义【后面会详细讲的】 // Vue.extend() 中 data 必须是函数 var Component = Vue.extend({ data: function () { //这里必须是函数!!!! return { a: 1 } } }) 5.1.2. Vue实例的computed介绍

    Vue的计算属性(computed)的属性会自动混入Vue的实例中。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。这就很强大了,再计算属性中定义的函数里面可以直接使用指向了vue实例的this,异常方便的啊。

    类型

    { 键:函数} { [key: string]: Function | { get: Function, set: Function } } 当然,可以省略setter,如果省略了setter,那么值就可以是普通函数,但是必须有返回值。

    官方的实例 var vm = new Vue({ data: { a: 1 }, computed: { // 仅读取,值只须为函数 aDouble: function () { return this.a * 2 }, // 读取和设置 aPlus: { get: function () { return this.a + 1 }, set: function (v) { this.a = v - 1 } } } }) vm.aPlus // -> 2 vm.aPlus = 3 vm.a // -> 2 vm.aDouble // -> 4 5.1.3. methods

    类型: { [key: string]: Function }

    详细:

    methods 将被混入到 Vue 实例中。可以直接通过 VM 实例访问这些方法,或者在指令表达式中使用。方法中的 this 自动绑定为 Vue 实例。

    注意,不应该使用箭头函数来定义 method 函数 (例如 plus: () => this.a++)。理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例,this.a 将是 undefined。

    示例: var vm = new Vue({ data: { a: 1 }, methods: { plus: function () { this.a++ } } }) vm.plus() vm.a // 2 5.1.4. watch类型

    { [key: string]: string | Function | Object }

    详细:

    一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个属性。

    示例: var vm = new Vue({ data: { a: 1, b: 2, c: 3 }, watch: { // 监控a变量变化的时候,自动执行此函数 a: function (val, oldVal) { console.log('new: %s, old: %s', val, oldVal) }, // 深度 watcher c: { handler: function (val, oldVal) { /* ... */ }, deep: true } } }) vm.a = 2 // -> new: 2, old: 1 //注意,不应该使用箭头函数来定义 watcher 函数 (例如 searchQuery: newValue => this.updateAutocomplete(newValue))。理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例,this.updateAutocomplete 将是 undefined。

    参考综合案例:

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之数据监控</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="app"> <p>{{ number }}</p> <input type="button" name="btnGetNumber" value="增加" v-on:click="getNumber()"> </div> <script> var app = new Vue({ el: '#app', data: { number: 1 }, methods: { // 事件响应方法的逻辑代码 getNumber: function (e) { this.number += 1; // 不管是内联方法调用,还是绑定事件处理器两种方式执行事件响应方法的时候 this都是指向 app } }, watch: { // 监控number的变化,并自动执行下面的函数 number: function (val, oldVal) { console.log('val:' + val + ' - oldVal: ' + oldVal); } } }); </script> </body> </html? 5.1.5. 设置el的详解类型

    string | HTMLElement

    限制: 只在由 new 创建的实例中遵守。

    详细:

    提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标,也就是说Vue绑定数据到哪里去找。可以是CSS 选择器,也可以是一个 HTMLElement实例。

    在实例挂载之后(生命周期的内容后面会详细讲的奥), 元素可以用 vm.$el 访问。

    如果这个选项在实例化时有作用,实例将立即进入编译过程,否则,需要显式调用 vm.$mount() 手动开启编译。

    var app = new Vue({ el: '#app', ... }); 5.2. Vue实例的生命周期

    Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。

    在Vue的整个生命周期中,它提供了一系列的事件,可以让我们注册js方法,可以让我们达到控制整个过程的目的地,哇赛,如果你搞过Asp.Net WebForm的话,你会发现整个就是WebForm的翻版嘛哈哈。值得注意的是,在这些事件响应方法中的this直接指向的是vue的实例。

    首先看看下面官网的一张生命周期的图,我做一下标注,看看整体的流程,后面我们上代码做一下效果。

    Vue提供的可以注册的钩子都在上图片的红色框标注。 他们是:

    beforeCreate

    在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用。

    created

    实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。

    beforeMount

    在挂载开始之前被调用:相关的 render 函数首次被调用。

    mounted

    el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内。

    beforeUpdate

    数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。 你可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。

    updated

    由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。

    当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。

    该钩子在服务器端渲染期间不被调用。

    beforeDestroy

    实例销毁之前调用。在这一步,实例仍然完全可用。

    destroyed

    Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。 该钩子在服务器端渲染期间不被调用。

    接下来我们做一个例子,看一下Vue中所有的生命周期怎么用的。

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之生命周期</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="app"> <p>{{ number }}</p> <input type="text" name="btnSetNumber" v-model="number"> </div> <script> var app = new Vue({ el: '#app', data: { number: 1 }, beforeCreate: function () { console.log('beforeCreate 钩子执行...'); console.log(this.number) }, cteated: function () { console.log('cteated 钩子执行...'); console.log(this.number) }, beforeMount: function () { console.log('beforeMount 钩子执行...'); console.log(this.number) }, mounted: function () { console.log('mounted 钩子执行...'); console.log(this.number) }, beforeUpdate: function () { console.log('beforeUpdate 钩子执行...'); console.log(this.number) }, updated: function () { console.log('updated 钩子执行...'); console.log(this.number) }, beforeDestroy: function () { console.log('beforeDestroy 钩子执行...'); console.log(this.number) }, destroyed: function () { console.log('destroyed 钩子执行...'); console.log(this.number) }, }); </script> </body> </html>

    再看一个综合的实战的例子,可能涉及到ajax和组件,不过先看一下vue的生命周期的例子的用法:

    import Axios from 'axios' // 这是一个轻量级的ajax库,import是es6模块导入的语法。 export default { // 这是一个vue的模块,后面讲奥。 name: 'app', components: { }, data: function () { return { list: [] } }, mounted: function () { // 挂在完成后的生命周期钩子注册。 this.$nextTick(function () { // 等待下一次更新完成后执行业务处理代码。 Axios.get('/api/menulist', {// 将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新 params: { } }).then(function (res) { this.list = res.data }.bind(this)) }) } } 5.3. Vue实例的全局配置

    这一块都是一些小的知识点,我就不赘述了,直接copy 官网 Vue.config 是一个对象,包含 Vue 的全局配置。可以在启动应用之前修改下列属性:

    silent

    类型: boolean

    默认值: false

    用法:

    Vue.config.silent = true //取消 Vue 所有的日志与警告。 optionMergeStrategies

    optionMergeStrategies

    类型: { [key: string]: Function }

    默认值: {}

    用法:

    Vue.config.optionMergeStrategies._my_option = function (parent, child, vm) { return child + 1 } const Profile = Vue.extend({ _my_option: 1 })

    devtools

    类型: boolean

    默认值: true (生产版为 false)

    用法:

    // 务必在加载 Vue 之后,立即同步设置以下内容 Vue.config.devtools = true //配置是否允许 vue-devtools 检查代码。开发版本默认为 true,生产版本默认为 false。生产版本设为 true 可以启用检查。 er

    errorHandler

    类型: Function

    默认值: 默认抛出错误

    用法:

    Vue.config.errorHandler = function (err, vm) { // handle error } //指定组件的渲染和观察期间未捕获错误的处理函数。这个处理函数被调用时,可获取错误信息和 Vue 实例。 //Sentry, an error tracking service, provides official integration using this option.

    ignoredElements

    类型: Array

    默认值: []

    用法:

    Vue.config.ignoredElements = [ 'my-custom-web-component', 'another-web-component' ] 须使 Vue 忽略在 Vue 之外的自定义元素 (e.g., 使用了 Web Components APIs)。否则,它会假设你忘记注册全局组件或者拼错了组件名称,从而抛出一个关于 Unknown custom element 的警告。

    keyCodes

    类型: { [key: string]: number | Array }

    默认值: {}

    用法:

    Vue.config.keyCodes = { v: 86, f1: 112, mediaPlayPause: 179, up: [38, 87] } //给 v-on 自定义键位别名。 5.4. Vue的全局API

    Vue的全局API提供大量的功能,我这里就给大家罗列几个常用的结果,其他的还是参考官网.

    5.4.1. Vue.nextTick

    语法: Vue.nextTick( [callback, context] )

    参数:    {Function} [callback]{Object} [context]

    用法: 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

    // 修改数据 vm.msg = 'Hello' // DOM 还没有更新 Vue.nextTick(function () { // DOM 更新了 }) 5.4.2. Vue.set

    语法: Vue.set( object, key, value )

    参数:{Object} object,{string} key,{any} value

    返回值: 设置的值.

    用法:
    设置对象的属性。如果对象是响应式的,确保属性被创建后也是响应式的,同时触发视图更新。这个方法主要用于避开 Vue 不能检测属性被添加的限制。 注意对象不能是 Vue 实例,或者 Vue 实例的根数据对象。

    5.4.3. Vue.compile语法:

    Vue.compile( template )

    参数:

    {string} template

    用法: //在render函数中编译模板字符串。只在独立构建时有效 var res = Vue.compile('<div><span>{{ msg }}</span></div>') new Vue({ data: { msg: 'hello' }, render: res.render, staticRenderFns: res.staticRenderFns }) 5.4.4. 全局API总结

    其实还有几个其他的全局API,不打算在这里讲了,比如扩展组件Vue.extend 的用法、Vue.use加载插件、Vue.filter加载过滤器、Vue.directive自定义指令等 后面再讲其他Vue的知识点的时候,再加上这些,全局API其实就是Vue类型的静态方法,全局范围内都可以使用的,某些实例的方法本质也是调用了这些全局的,后面用到时候再说。

    5.5. Vue实例与生命周期总结

    Vue的实例封装的还是挺有艺术性的,很符合开发者的思维规范,它的生命周期也非常清晰,使用起来也非常方便。Vue确实一个好框架。

    转载:https://www.cnblogs.com/fly_dr...

    作者:老马

  • Vue 75 0 1 发布

    4.1. 监听事件的Vue处理

    Vue提供了协助我们为标签绑定时间的方法,当然我们可以直接用dom原生的方式去绑定事件。Vue提供的指令进行绑定也是非常方便,而且能让ViewModel更简洁,逻辑更彻底。所以还是推荐大家使用的。

    Vue提供了v-on指令帮助我们进行事件的绑定。 基本的内联事件处理方法[官方demo]:

    <div id="example-1"> <!-- 为按钮绑定点击事件,执行counter += 1的任务。 --> <button v-on:click="counter += 1">增加 1</button> <p>这个按钮被点击了 {{ counter }} 次。</p> </div> <script> var example1 = new Vue({ el: '#example-1', data: { counter: 0 } }) </script> 4.2. 事件处理方法集成到Vue对象

    内联的方式绑定的事件,只能处理简单的事件的处理逻辑。复杂的情况还是封装到js中最方便,也不容易出错。 Vue对象中可以添加methods属性,开发者可以把事件处理函数的逻辑放到methods中。

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之动态显示表格</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="app"> <p>{{ number }}</p> <input type="button" name="btnGetNumber" value="增加[绑定事件处理器]" v-on:click="getNumber"> <input type="button" name="btnGetNumber" value="增加[内联方法调用]" v-on:click="getNumber()"> </div> <script> var app = new Vue({ el: '#app', data: { number: 1 }, methods: { // 事件响应方法的逻辑代码 getNumber: function (e) { this.number += 1; // 不管是内联方法调用,还是绑定事件处理器两种方式执行事件响应方法的时候 this都是指向 app } } }); </script> </body> </html> 4.3. 事件修饰符

    官网上写的非常好,这块就直接用管网的吧。在事件处理程序中调用 event.preventDefault() 或 event.stopPropagation() 是非常常见的需求。尽管我们可以在 methods 中轻松实现这点,但更好的方式是:methods 只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。 为了解决这个问题, Vue.js 为 v-on 提供了 事件修饰符。通过由点(.)表示的指令后缀来调用修饰符。

    .stop.prevent.capture.self.once <!-- 阻止单击事件冒泡 --> <a v-on:click.stop="doThis"></a> <!-- 提交事件不再重载页面 --> <form v-on:submit.prevent="onSubmit"></form> <!-- 修饰符可以串联 --> <a v-on:click.stop.prevent="doThat"></a> <!-- 只有修饰符 --> <form v-on:submit.prevent></form> <!-- 添加事件侦听器时使用事件捕获模式 --> <div v-on:click.capture="doThis">...</div> <!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 --> <div v-on:click.self="doThat">...</div> <!-- the click event will be triggered at most once --> <a v-on:click.once="doThis"></a>
    4.4. 按键修饰符

    在监听键盘事件时,我们经常需要监测常见的键值。 Vue 允许为 v-on 在监听键盘事件时添加按键修饰符:

    <!-- 只有在 keyCode 是 13 时调用 vm.submit() --> <input v-on:keyup.13="submit"> 记住所有的 keyCode 比较困难,所以 Vue 为最常用的按键提供了别名: <!-- 同上 --> <input v-on:keyup.enter="submit"> <!-- 缩写语法 --> <input @keyup.enter="submit">

    全部的按键别名:

    .enter.tab.delete (捕获 “删除” 和 “退格” 键).esc.space.up.down.left.right.ctrl.alt.shift.meta4.5. 事件绑定的简写

    Vue中属性的绑定的简写直接是: === 'v-bind:'
    而事件的缩写是直接变成@. 也就是说: v-on: === @ 看下面的例子: 

    <!-- 完整语法 --> <a v-on:click="doSomething"></a> <!-- 缩写 --> <a @click="doSomething"></a> 4.6. 事件绑定总结

    Vue为了方便大家进行开发,提供了事件的相关的封装,可以让我们方便我们用Vue对事件进行开发,尤其是v-on指令的非常方便的跟Vue对象中methods进行配合进行复杂的事件处理,非常方便。另外事件的事件修饰符和按键修饰符也可以让Vue事件这块锦上添花。

    转载:https://www.cnblogs.com/fly_dr...

    作者:老马

  • Vue 57 0 1 发布

    3.1. 条件渲染

    有时候我们要根据数据的情况,决定标签是否进行显示或者有其他动作。最常见的就是,表格渲染的时候,如果表格没有数据,就显示无数据。如果有数据就显示表格数据。 Vue帮我们提供了一个v-if的指令,帮助我们完成判断的模板处理。

    <div id="app"> <h1 v-if="ok">Yes</h1> <h1 v-else>No</h1> </div> <!-- 当ok为true的时候,输出: Yes, 否则输出: No --> <script> var app = new Vue({ el: '#app', data: { ok: true // true,返回:Yes, false=> No } }); </script>

    v-if指令可以根据数据绑定的情况进行插入标签或者移除标签。 当然,如果熟悉js的都清楚,有if,肯定会有else。 Vue提供的是 v-else指令。

    3.2. 列表渲染3.2.1. 基本v-for循环渲染标签

    模板引擎都会提供循环的支持。Vue也不例外,Vue是提供了一个v-for指令。基本的用法类似于foreach的用法。还是看例子最直接,上代码:

    <div id="app"> <table> <thead> <tr> <th>姓名</th> <th>年龄</th> <th>地址</th> </tr> </thead> <tbody> <!-- 每次for循环,都会创建一个tr标签。item是遍历的元素。 --> <tr v-for="item in UserList" > <td>{{ item.name }}</td> <td>{{ item.age }}</td> <td>{{ item.address }}</td> </tr> </tbody> </table> </div> <script> var app = new Vue({ el: '#app', data: { UserList: [ {'name': 'malun', 'age': 18, 'address': '北京黑地下室'}, {'name': 'flydragon', 'age': 22, 'address': '厦门的很多热的地方'}, {'name': 'temp', 'age': 25, 'address': '东北松花江上'} ] } }); </script> 3.2.2. Template循环渲染多标签

    上面的例子,我们演示的是 每次循环输出一个tr标签。如果我们希望每次循环生成两个tr标签呢?如果还有生成其他的标签呢?

    Vue给我们提供了template标签,供我们用于v-for循环中进行处理。

    上代码喽:

    <ul> <!-- 通过template标签,可以一次循环,输出两个li标签 --> <template v-for="item in items"> <li>{{ item.msg }}</li> <li class="divider"></li> </template> </ul> 3.2.3. 关于v-for对应的数组的更新

    由于Vue的机制就是检测数据的变化,自动跟新HTML。数组的变化,Vue之检测部分函数,检测的函数执行时才会触发视图更新。这些方法如下:

    push()pop()shift()unshift()splice()sort()reverse()3.3. 表格显示的综合案例

    下面是一个综合的案例,每秒钟往表格中添加一条数据。 本案例综合使用了v-if 和 v-for循环综合案例。

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之动态显示表格</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="app"> <table> <thead> <tr> <th>姓名</th> <th>年龄</th> <th>地址</th> </tr> </thead> <!-- 如果列表有数据,直接输出表格数据,没有数据提示用户没有数据 --> <tbody v-if="UserList.length > 0"> <tr v-for="item in UserList" > <td>{{ item.name }}</td> <td>{{ item.age }}</td> <td>{{ item.address }}</td> </tr> </tbody> <tbody v-else> <tr><td colspan="3">没有数据奥!</td></tr> </tbody> </table> </div> <script> var app = new Vue({ el: '#app', data: { UserList: [] } }); // 每秒钟插入一条数据。 setInterval(function () { app.UserList.push({'name': 'malun', 'age': 18, 'address': '北京黑地下室'}); }, 1000); </script> </body> </html> 3.4. 总结列表和条件绑定

    列表的使用其实本质还是js的衍生使用,对于有js开发基础的没有什么难度。关键是多写几个案例就会详细通了。

    转载:https://www.cnblogs.com/fly_dr...

    作者:老马

  • Vue 70 0 1 发布
    2.1. 什么是双向绑定?

    Vue框架很核心的功能就是双向的数据绑定。 双向是指:HTML标签数据 绑定到 Vue对象,另外反方向数据也是绑定的。通俗点说就是,Vue对象的改变会直接影响到HTML的标签的变化,而且标签的变化也会反过来影响Vue对象的属性的变化。
    这样以来,就彻底变革了之前Dom的开发方式,之前Dom驱动的开发方式尤其是以jQuery为主的开发时代,都是dom变化后,触发js事件,然后在事件中通过js代码取得标签的变化,再跟后台进行交互,然后根据后台返回的结果再更新HTML标签,异常的繁琐。有了Vue这种双向绑定,让开发人员只需要关心json数据的变化即可,Vue自动映射到HTML上,而且HTML的变化也会映射回js对象上,开发方式直接变革成了前端由数据驱动的 开发时代,远远抛弃了Dom开发主导的时代了。

    2.2. Vue绑定文本

    数据绑定最常见的形式就是使用 “Mustache” 语法(双大括号)的文本插值,比如模板引擎:handlebars中就是用的{{}}.
    创建的Vue对象中的data属性就是用来绑定数据到HTML的。参考如下代码:

    <span>Message: {{ msg }}</span> <script> var app = new Vue({ // 创建Vue对象。Vue的核心对象。 el: '#app', // el属性:把当前Vue对象挂载到 div标签上,#app是id选择器 data: { // data: 是Vue对象中绑定的数据 msg: 'Hello Vue!' // message 自定义的数据 } }); </script> 2.3. 绑定数据中使用JavaScript表达式

    对于所有的数据绑定, Vue.js 都提供了完全的 JavaScript 表达式支持。

    <span>Message: {{ msg + ' - ' + name }}</span> <script> var app = new Vue({ // 创建Vue对象。Vue的核心对象。 el: '#app', // el属性:把当前Vue对象挂载到 div标签上,#app是id选择器 data: { // data: 是Vue对象中绑定的数据 msg: 'Hi', // message 自定义的数据 name: 'flydragon' // name自定义的属性,vue可以多个自定义属性,属性类型也可是复杂类型 } }); </script>

    结果:

    Hi - flydragon

    当然Vue还可以支持表达中的任何计算、函数处理等。参考下面的综合点的案例。

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之数据绑定-表达式运算</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="app"> {{ msg + ' - ' + name }} <p> {{ isOk ? '123' : '456' }} </p> <p>我的年龄是: {{ age *2 }}</p> </div> <script> var app = new Vue({ // 创建Vue对象。Vue的核心对象。 el: '#app', // el属性:把当前Vue对象挂载到 div标签上,#app是id选择器 data: { // data: 是Vue对象中绑定的数据 msg: 'Hi', // message 自定义的数据 name: 'flydragon', isOk: true, age: 18 } }); </script> </body> </html> 2.4. Vue属性绑定

    Vue中不能直接使用{{ expression }} 语法进行绑定html的标签,而是用它特有的v-bind指令(就是一种写法,先按照格式走,具体指令是什么可以后续再了解)。

    绑定的语法结构:

    <span v-bind:id="menuId">{{ menuName }}</span>

    参考如下代码案例:

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之数据绑定--属性绑定</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="app"> <div v-bind:id="MenuContaineId"> <a href="#" v-bind:class="MenuClass">首页</a> <a href="#" v-bind:class="MenuClass">产品</a> <a href="#" v-bind:class="MenuClass">服务</a> <a href="#" v-bind:class="MenuClass">关于</a> </div> </div> <script> var app = new Vue({ el: '#app', data: { // data: 是Vue对象中绑定的数据 MenuClass: 'top-menu', MenuContaineId: 'sitemenu' } }); </script> </body> </html> 2.5. 属性绑定简写

    由于v-bind 使用非常频繁,所以Vue提供了简单的写法,可以去掉v-bind直接使用:即可。例如:

    <div :id="MenuContaineId">

    等价于:

    <div v-bind:id="MenuContaineId"> 2.6. 输出纯HTML

    由于Vue对于输出绑定的内容做了提前encode,保障在绑定到页面上显示的时候不至于被xss攻击。但某些场景下,我们确保后台数据是安全的,那么我们就要在网页中显示原生的HTML标签。Vue提供了v-html指令。

    <div id="app"> <div v-bind:id="MenuContaineId" v-html="MenuBody"> </div> </div> <script> var app = new Vue({ el: '#app', data: { // data: 是Vue对象中绑定的数据 MenuContaineId: 'menu', MenuBody: '<p>这里是菜单的内容</p>' } }); </script>

    结果:

    <div id="app"> <div id="menu"> <p>这里是菜单的内容</p> </div> </div> 2.7. 样式绑定

    对于普通的属性的绑定,只能用上面的讲的绑定属性的方式。而Vue专门加强了class和style的属性的绑定。可以有复杂的对象绑定、数组绑定样式和类。

    2.7.1. 绑定样式对象

    经常我们需要对样式进行切换,比如:div的显示和隐藏,某些标签active等。Vue提供的对象绑定样式的方式就很容做这些事情。

    代码: 

    <div v-bind:class="{ active: isActive }"></div> 解释:当 isActive为 true时, div就会具有了active样式类,如果 isActive为false,那么div就去掉active样式类。<span></span> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之绑定样式类</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> <style> .active { background-color: #ccc; } </style> </head> <body> <div id="app"> <div v-bind:id="MenuContaineId" v-bind:class="{ active: isActive }"> 绑定颜色类 </div> </div> <script> var app = new Vue({ el: '#app', data: { // data: 是Vue对象中绑定的数据 MenuContaineId: 'menu', isActive: true } }); </script> </body> </html> 

    解释: 当 isActive为 true时, div就会具有了active样式类,如果 isActive为false,那么div就去掉active样式类。

    2.7.2. 混合普通的HTML标签样式类及绑定样式对象

    v-bind:class 指令可以与普通的 class 属性共存。

    <div id="app"> <div class="static" v-bind:class="{ active: isActive, 'text-danger': hasError }"> </div> </div> <script> var app = new Vue({ el: '#app', data: { // data: 是Vue对象中绑定的数据 isActive: true, hasError: false } }); </script>

    结果:

    <div id="app"> <div class="static active"> </div> </div> 2.7.3. 绑定data中的样式对象

    直接在html属性中的双引号内写对象,还是很不爽,也没有智能提示,很容易写错。 Vue可以让我们直接把绑定的class字符串指向data的一个对象,这样就非常方便了,既可以有智能提示,又可以很复杂进行编辑,不用担心烦人的""了。

    <div id="app"> <div class="static" v-bind:class="classObject"> </div> </div> <script> var app = new Vue({ el: '#app', data: { classObject: { active: true, 'text-danger': false } } }); </script>

    结果:

    <div id="app"> <div class="static active"> </div> </div> 2.7.4. 绑定样式数组

    其实绑定数组,就是绑定样式对象的延续,看官网的例子代码吧。

    <div v-bind:class="[activeClass, errorClass]"> data: { activeClass: 'active', errorClass: 'text-danger' }

    当然还有很多其他很有趣的支持,就不赘述了。例如:

    例如: <div v-bind:class="[isActive ? activeClass : '', errorClass]"> <div v-bind:class="[{ active: isActive }, errorClass]"> 2.7.5. 内联样式绑定

    内联样式的绑定,非常类似于样式类的操作。v-bind:style 的对象语法十分直观——看着非常像 CSS ,其实它是一个 JavaScript 对象。 CSS属性名可以用驼峰式(camelCase)或短横分隔命名(kebab-case)。

    看个例子:

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之htmlraw</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="app"> <div v-bind:style="{fontSize: size + 'px', backgroundColor: bgcolor, width: width}"> vue 入门系列教程 </div> </div> <script> var app = new Vue({ el: '#app', data: { size: 19, width: 200, bgcolor: 'red' } }); </script> </body> </html>

    自动添加前缀
    当 v-bind:style 使用需要特定前缀的 CSS 属性时,如 transform ,Vue.js 会自动侦测并添加相应的前缀。

    2.8. 计算属性

    在做数据的绑定的时候,数据要进行处理之后才能展示到html页面上,虽然vue提供了非常好的表达式绑定的方法,但是只能应对低强度的需求。比如: 把一个日期按照规定格式进行输出,可能就需要我们对日期对象做一些格式化的出来,表达式可能就捉襟见肘了。

    Vue对象提供的computed属性,可以让我们开发者在里面可以放置一些方法,协助我们绑定数据操作,这些方法可以跟data中的属性一样用,注意这些方法用的时候不要加()。 例子来了:

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之htmlraw</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="app"> <table> <tr> <!-- computed里面的函数可以直接当成data里面的属性用,非常方便,注意没有括号!!!--> <td>生日</td><td>{{ getBirthday }}</td> </tr> <tr> <td>年龄</td><td>{{ age }}</td> </tr> <tr> <td>地址</td><td>{{ address }}</td> </tr> </table> </div> <script> var app = new Vue({ el: '#app', data: { birthday: 914228510514, // 这是一个日期对象的值:1998年11月1日 age: 19, address: '北京昌平区龙泽飞龙' }, computed: { // 把日期换成 常见规格格式的字符串。 getBirthday: function () { var m = new Date(this.birthday); return m.getFullYear() + '年' + m.getMonth() +'月'+ m.getDay()+'日'; } } }); </script> </body> </html> 2.9. 绑定的数据过滤器

    过滤器本质就是数据在呈现之前先进行过滤和筛选。官网上写的不错,我就不再赘述,下面是官网的描述。

    Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。过滤器应该被添加在 mustache 插值的尾部,由“管道符”指示:

    {{ message | capitalize }} <!-- in mustaches --> {{ message | capitalize }} <!-- in v-bind --> <div v-bind:id="rawId | formatId"></div> Vue 2.x 中,过滤器只能在 mustache 绑定和 v-bind 表达式(从 2.1.0 开始支持)中使用,因为过滤器设计目的就是用于文本转换。为了在其他指令中实现更复杂的数据变换,你应该使用计算属性。 过滤器函数总接受表达式的值作为第一个参数。 new Vue({ // ... filters: { capitalize: function (value) { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1) } } }) 过滤器可以串联: {{ message | filterA | filterB }} 过滤器是 JavaScript 函数,因此可以接受参数: {{ message | filterA('arg1', arg2) }} 这里,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。 2.10. 核心:自动响应对象的变化到HTML标签

    上面的例子都是 数据对象是写死在创建的Vue对像上,那如果数据(data)发生改变时会怎样呢? 让我们用chrome把上面例子的页面打开,并打开发者工具控制台,输入:app.age = 20 会有什么情况发生呢?

     

    在页面中添加一个按钮,动态的增加年龄:

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之htmlraw</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="app"> <table> <tr> <!-- computed里面的函数可以直接当成data里面的属性用,非常方便,注意没有括号!!!--> <td>生日</td><td>{{ getBirthday }}</td> </tr> <tr> <td>年龄</td><td>{{ age }}</td> </tr> <tr> <td>地址</td><td>{{ address }}</td> </tr> </table> </div> <!-- 添加下面这行代码,动态增加 年龄,页面会有怎样的变化呢?? --> <button type="button" onclick="app.age+=1;" >加加</button> <script> var app = new Vue({ el: '#app', data: { birthday: 914228510514, // 这是一个日期对象的值:1998年11月1日 age: 19, address: '北京昌平区龙泽飞龙' }, computed: { // 把日期换成 常见规格格式的字符串。 getBirthday: function () { var m = new Date(this.birthday); return m.getFullYear() + '年' + m.getMonth() +'月'+ m.getDay()+'日'; } } }); </script> </body> </html> 2.11. 双向数据绑定

    上面的例子我们大多讲的是单向的 js对象向 HTML数据进行绑定,那HTML怎样向js进行反馈数据呢? HTML中只有表达能接受用户的输入,最简单的演示双向绑定的就是文本框了。

    Vue提供了一个新的指令:v-model进行双向数据的绑定,注意不是v-bind。

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之htmlraw</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="app"> <!-- v-model可以直接指向data中的属性,双向绑定就建立了 --> <input type="text" name="txt" v-model="msg"> <p>您输入的信息是:{{ msg }}</p> </div> <script> var app = new Vue({ el: '#app', data: { msg: '双向数据绑定的例子' } }); </script> </body> </html>

    最终的结果就是:你改变input文本框的内容的时候,p标签中的内容会跟着进行改变,哇是不是很神奇呢...

    关于其他表单的绑定的语法我就不赘述了,还是参考官网吧,我这里大部分例子也是来自官网

    2.12. 数据绑定总结

    vue提供了大量的绑定的语法和方法,非常方便我们进行数据的绑定,尤其它是双向的数据绑定,极大的减少了我们dom操作的麻烦程度。可能你越来越喜欢它了吧...

    转载:https://www.cnblogs.com/fly_dr...

    作者:老马

  • Vue 70 0 1 发布
    1.1. Vue简介

    Vue是一个前端的双向绑定类的框架,发音[读音 /vjuː/, 类似于 view]。新的Vue版本参考了React的部分设计,当然也有自己独特的地方,比如Vue的单文件组件开发方式都很有创新,另外Vue自身的一些绑定的语法、用法等都非常精炼,很容易上手,而且第三方的插件都非常丰富,社区非常活跃,最新的文档都有中文版本。而且Vue配合官方的和第三方的库可以实现单文件的组件化开发、SPA等现代化前端开发。

    1.2. Vue的入门demo

    Vue 可以直接把它当做一个js库使用,所以它可以很容易的接入到你的项目或者单个页面中。甚至你可以只使用它的双向绑定功能。所以它很容易上手。

    比如:我们有一个需求,一个网页上一个Div标签,我们有一个json对象存储数据,把json对象上的数据放到Div上去。

    接下来是步骤:

    第一步: 创建一个文件夹并创建一个html文件 比如:index.html.
    当如你可以选择你自己的编辑器,我就用VSCode。第二步:引入Vue库
    当然了你可以直接下载Vue的js文件,推荐你直接用上面的cdn即可。第三步:创建一个Div,给它一个id,比如:app第四步:创建Vue的对象,并把数据绑定到上面创建好的div上去。

    最终的代码如下:

    <!DOCTYPE html> <!--第一步:创建文件夹及html文件--> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue入门之Helloworld</title> <!--第二步:引入Vue库--> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <!--第三步:创建一个Div--> <div id="app"> <!--Vue的模板的绑定数据的方法, 类似于很多其他前端的模板,可以用两对花括号进行绑定Vue中的数据对象的属性 --> {{ message }} </div> <!--第四步:创建Vue的对象,并把数据绑定到上面创建好的div上去。--> <script> var app = new Vue({ // 创建Vue对象。Vue的核心对象。 el: '#app', // el属性:把当前Vue对象挂载到 div标签上,#app是id选择器 data: { // data: 是Vue对象中绑定的数据 message: 'Hello Vue!' // message 自定义的数据 } }); </script> </body> </html> 

    最终的结果就是:

    Hello Vue!1.3. Vue的Helloworld总结Vue构造函数的:选项el属性,就是element缩写,当前Vue对象挂载到哪个标签上的语法,支持CSS选择器或者dom对象,一般用id选择器选择当前页面的标签。Vue的选项:data属性是自定义数据。这里我们只是演示了一个message属性,vue会把自定义的数据可以与html的模板数据进行绑定。Vue 数据绑定的方式就是用 {{}},类似于handlebars.上面这个demo就是演示了Vue的绑定数据的基本模型。注意点,标签先创建好了之后,再创建Vue对象,具体你应该懂吧。

    转载:https://www.cnblogs.com/fly_dragon/p/6218551.html

    作者:老马

  • 东北 旅游 110 0 1 发布

    辽宁省,古称“奉天省”“盛京”,位于东北地区,简称辽,省会沈阳。辽宁界于北纬38°43'至43°26',东经118°53'至125°46'之间,南濒黄海、渤海二海,西南与河北接壤,西北与内蒙古毗连,东北与吉林为邻,东南以鸭绿江为界与朝鲜隔江相望,总面积14.86万平方公里。

    主要旅游景点景点等级门票开放时间地址/电话1沈阳市植物园
    5A

    50元(预订优惠价:45元)

    8:00-17:00辽宁省沈阳市浑南区双园路301号
    4000998998、024-31689919
    2大连老虎滩海洋公园·老虎滩极地馆
    5A
    98元(旺季)、180元(淡季)
    8:00-17:00
    大连市中山区滨海中路9号
    0411-82689356
    3大连市金石滩景区
    5A
    90元
    08:30~17:30
    辽宁大连市金州新区
    0411-87900241
    4本溪市本溪水洞景区
    5A
    170元
    旺季8:30-17:00
     淡季9:00-16:00
    辽宁省本溪市东郊
    5鞍山市千山景区
    5A
    80元(预订优惠价:72元);
    24小时
    辽宁省鞍山市千山区千山东路79号

    沈阳市植物园

    沈阳市植物园,位于沈阳市东陵区,又称沈阳世博园、沈阳世界园艺博览园,是集绿色生态观赏、精品园林艺术、人文景观建筑、科研科普教育、娱乐休闲活动于一体的多功能综合性旅游景区。始建于1959年2月,1993年正式对外开放。占地面积211公顷。以百合塔、凤凰广场、玫瑰园为标志性主题建筑,荟萃了世界五大洲及国内重点城市的园林和建筑精品,共有100个展园分布于南北两区。

    大连老虎滩海洋公园·老虎滩极地馆

    大连老虎滩海洋公园,国家5A级景区,距大连市中心5公里,占地面积188万平方米,4000余米海岸线,园区自然风光秀丽,山海互映,景色迷人,是展示海洋文化,突出滨城特色,集海洋动物、海洋生物展示,海洋动物表演,海洋游乐,海洋科普教育为一体的现代化海洋主题公园。

    大连市金石滩景区

    大连市金石滩是国家级风景名胜区、国家级旅游度假区、国家5A级旅游景区、国家级地质公园。主要景点有海水浴场、金石缘公园、国家地质公园、金石蜡像馆、发现王国等。

    本溪市本溪水洞景区

    本溪水洞风景名胜区,国家重点风景名胜区、国家4A级景区,位于辽宁省本溪市东郊,距市中心26公里。本溪水洞是目前发现的世界第一长的地下充水溶洞,被誉为“北国一宝”、“天下奇观”、“亚洲一流”、“世界罕见”。
    本溪水洞风景名胜区是以水洞为中心,包括温泉、庙后山、关门山、汤沟和铁刹山在内的国家重点风景名胜区,是集山、水、洞、泉、湖、林等自然景观和寺庙、古人类遗址等人文景观于一体,同大连海滨、千山风光、长白山景联袂相映形成东北亚风景旅游胜地之一。

    鞍山市千山景区

    鞍山千山风景名胜区位于辽宁省鞍山市境内,又称积翠山、千华山、千顶山、千朵莲花山,位于辽宁省鞍山市东南17公里处,总面积44平方公里,素有“东北名珠”之称,为国家重点风景名胜区。
    千山,以奇峰、岩松、古庙、梨花组成四大景观。仙人台,又名观音峰,位于南部游览区,大安、中会,香岩诸寺和五龙宫诸庙宇拱卫之中。

  • 西南 旅游 128 0 1 发布

    西藏,简称“藏”。西藏自治区,首府拉萨市,位于中华人民共和国西南边陲,是中国五个少数民族自治区之一。西藏位于青藏高原西南部,地处北纬26°50′至36°53′,东经78°25′至99°06′之间,平均海拔在4000米以上,素有“世界屋脊”之称。土地面积为120218947.91公顷  ,约占全国总面积的1/8,在全国各省、市、自治区中仅次于新疆。2018年末常住人口343.82万人。

    主要旅游景点景点等级门票开放时间地址/电话1拉萨市布达拉宫景区
    5A

    200元

    09:00~12:00 15:30~16:30拉萨市城关区北京
    0891-6339615
    2拉萨市大昭寺

    85元
    09:00~18:00 西藏自治区拉萨市城关区八角街
    0891-6323129
    3林芝巴松措景区
    120元
    7:00-18:00
    西藏自治区林芝地区巴河镇错高乡
    0894-5833361
    4日喀则扎什伦布寺景区
    55元
    09:00~17:00
    12:00~14:00佛殿不开放。
     西藏自治区日喀则
    0892-8825220

    拉萨市布达拉宫景区

    布达拉宫依山垒砌,群楼重叠,是藏式古建筑的杰出代表(据说源于桑珠孜宗堡),中华民族古建筑的精华之作,是第五套人民币50元纸币背面的风景图案 。主体建筑分为白宫和红宫两部分。宫殿高200余米,外观13层,内为9层。布达拉宫前辟有布达拉宫广场,是世界上海拔最高的城市广场。

    矗立在拉萨的市中心的布达拉宫是这座雪域之都乃至整个青藏高原的象征。这座世界上海拔最高、最雄伟的宫殿是藏文化最灿烂的象征。

    拉萨市大昭寺

    大昭寺已有1300多年的历史,在藏传佛教中拥有至高无上的地位。大昭寺是西藏现存最辉煌的吐蕃时期的建筑,也是西藏最早的土木结构建筑,并且开创了藏式平川式的寺庙市局规式。环大昭寺内中心的释迦牟尼佛殿一圈称为“囊廓”,环大昭寺外墙一圈称为“八廓”,大昭寺外辐射出的街道叫“八廓街”即八角街。以大昭寺为中心,将布达拉宫、药王山、小昭寺包括进来的一大圈称为“林廓”。这从内到外的三个环型,便是藏民们行转经仪式的路线。

    林芝巴松措景区

    巴松措又名措高湖,藏语中是“绿色的水”的意思,长约18公里,湖面面积约27平方公里,最深处达120米,湖面海拔3480米。 位于距工布江达县巴河镇约36千米的巴河上游的高峡深谷里,是红教的一处著名神湖和圣地。

    日喀则扎什伦布寺景区

    扎什伦布寺位于日喀则市城西的尼玛山脚下,整个寺院依山坡而建,背负高山,坐北向阳,殿宇逐次递接,疏密均衡,和谐对称。金顶红墙的高大主建筑群显得更为雄伟、浑厚、壮观。远处眺望,楼台醒目,殿堂叠耸,金碧辉煌,宏观而壮美。
    扎什伦布寺共有四大扎仓(僧院)、62个米村(依僧人来源的籍贯而定),佛堂和灵塔祀殿近60座。寺中心为殿堂区,建有措钦大殿、四大扎仓、班禅拉章、强巴大佛殿、班禅灵塔祀殿等。

  • 西南 旅游 99 0 1 发布

    重庆,简称“渝”。 为中华人民共和国省级行政区,中西部唯一的直辖市、国家中心城市、超大城市、国际大都市,长江上游地区的经济、金融、科创、航运和商贸物流中心,  西部大开发重要的战略支点、“一带一路”和长江经济带重要联结点以及内陆开放高地。

    主要旅游景点景点等级门票开放时间地址/电话1重庆大足石刻景区
    5A

    90元

    9:00-16:30023-43722268、437296002重庆巫山小三峡—小小三峡
    5A
    150元(预订优惠价:113元)
    08:00-17:30
    重庆市巫峡镇大宁河河口
    023-57756666
    3武隆喀斯特旅游区(天生三桥)
    5A
    125元(预订优惠价:121元)
    夏天08:30-16:30
    冬天09:00-16:00
    重庆
    023-77794228、77794266
    4仙女山(芙蓉洞)
    5A
    50元(预订优惠价:48元)
    夏天08:30-16:30
    冬天09:00-16:00重庆市武隆县仙女镇
    023—63763555
    5重庆酉阳桃花源景区
    5A
    100元(预订优惠价:80元)
    冬季08:00-17:30
    夏季07:30-18:00
    重庆市酉阳县钟多镇桃花源街232号
    023-75559222
    6黑山谷景区
    5A
    85(预订优惠价:80元)
    旺季8:30---15:30
    淡季9:00---15:00
    重庆市万盛区黑山镇境内
    023-48338893

    7重庆市江津四面山景区
    5A110元(预订优惠价:80元)
    9:00-19:00
    重庆市江津区四面山镇
    023-47666888

    8云阳龙缸景区
    5A
    100元08:00-17:30
    重庆市云阳县清水乡
    023-55333111

    重庆大足石刻景区

    大足石刻旅游景区(The Dazu Rock Carvings),是唐末、宋初时期的宗教摩崖石刻,以佛教题材为主,尤以北山摩崖造像和宝顶山摩崖造像最为著名,是中国著名的古代石刻艺术。北山摩崖造像位于重庆市大足区城北1.5公里的北山。北山摩崖造像长约三百多米,是全国重点文物保护单位、世界文化遗产。造像最初开凿于晚唐景福元年(公元892年),历经后梁、后唐、后晋、后汉、后周五代至南宋1162年完成,历时250多年。现存雕刻造像四千六百多尊,是中国晚期石窟艺术中的优秀代表。

    重庆巫山小三峡—小小三峡

    巫山小三峡,国家5A级景区、国家级重点风景名胜区,被名人誉为“中华奇观”,“天下绝景”。巫山小三峡是长江三峡段的第一大支流大宁河下游在巫山境内的龙门峡、巴雾峡、滴翠峡三段峡谷
    她一江碧水、奇峰壁立、竹木葱葱、猿声阵阵、饶有野趣,是一处巧夺天工的自然画廊。同时被誉为全国最佳漂流区,有惊无险的回归大自然参与式漂流——被称为“中国第一漂”。

    武隆喀斯特旅游区(天生三桥)

    天生三桥,国家5A级景区武隆喀斯特旅游区之一,景区内天生石桥气势磅礴,林森木秀、飞泉流瀑,包容了山、水、雾、泉、峡、峰、溪、瀑,是一处高品位的生态旅游区。
    武隆天生桥又名天坑三硚,是全国罕见的地质奇观生态型旅游区,属典型的喀斯特地貌。景区以天龙桥、青龙桥、黑龙桥三座气势磅礴的石拱桥称奇于世,属亚洲最大的天生桥群。

    仙女山(芙蓉洞)

    仙女山位于重庆市武隆区境乌江北岸,地属武陵山脉,距重庆市主城区180千米,海拔2033米,拥有森林33万亩,天然草原10万亩,夏季平均气温24℃。以其江南独具魅力的高山草原,南国罕见的林海雪原,青幽秀美的丛林碧野景观,被誉为“南国第一牧原”和“东方瑞士”,其旖旎美艳的森林草原风光在重庆独树一帜。
    仙女山冬季白雪皑皑、银妆纱裹,雾松、冰瀑令人情潮涌动,是重庆周边观赏雪景、开展雪上运动的绝佳旅游胜地;夏季茫茫林海,清风吹拂,凉爽宜人,平均气温比重庆主城区低15℃,有“山城夏宫”之美誉。

    仙女山与神奇的芙蓉洞、秀美的芙蓉江、世界最大的天生三硚群地质奇观,组合为重庆最佳旅游观光度假胜地,仙女山与江津石门镇的石笋山堪称重庆二绝。

    重庆酉阳桃花源景区

    重庆酉阳桃花源景区,位于重庆酉阳自治县城区,总面积50平方公里,由世外桃源、伏羲洞 、桃花源国家森林公园、桃花源广场、酉州古城、二酉山等六大部分组成,系国家5A级旅游景区 、国家级森林公园 、国家级地质公园 、国家级户外运动基地、重庆市文明旅游风景区。

    黑山谷景区

    黑山谷,国家5A级旅游景区,国家级森林公园,国家级地质公园,位于万盛区景星乡境内,距万盛城区20公里。这里山高林密、溪河纵横、人迹罕至,保存着地球上同纬度为数不多的亚热带和温带完好的自然生态,森林覆盖率达97%,被专家誉为“渝黔生物基因库”,是目前重庆地区最大的、原始生态保护最完好的自然生态风景区。

    重庆市江津四面山景区

    四面山,5A级景区、国家级风景名胜区,位于重庆市江津区境内,距重庆主城区130公里,距江津城区90公里。四面山系地质学上所谓"倒置山",因山脉四面围绕得名。四面山与石笋山被誉为巴国二灵山,石笋山因乃铁拐李修道之处而闻名。
    四面山主要景点有大窝铺、八角尖、坪山、吊桥、花果山、水帘洞、骆驼山、象鼻岭、猴子山、老虎嘴、倒流水、和尚山、摩天岭等。

    云阳龙缸景区

    云阳龙缸风景区:国家AAAAA级旅游景区、国家地质公园、2016国庆“旅游服务最佳景区”,被旅行者称为长江三峡最后的“香格里拉”,被户外爱好者誉为重庆版的“小华山”。
    云阳龙缸风景区位于重庆市云阳县境内东南隅,紧邻湖北利川市,集天坑、峡谷、溶洞、高山草场、森林、土家风情于一体,主要景点有龙缸天坑、云端廊桥、龙洞风光、龙窟峡、岐山草场、蔈草古长城、岐阳关古道遗址、盖下坝湖泊等。

  • 西南 旅游 132 0 1 发布

    云南省,简称云或滇,中国23个省之一,位于西南地区,省会昆明。界于北纬21°8′-29°15′,东经97°31′-106°11′之间,东部与贵州、广西为邻,北部与四川相连,西北部紧依西藏,西部与缅甸接壤,南部和老挝、越南毗邻,云南省总面积39.41万平方千米。

    主要旅游景点景点等级门票开放时间地址/电话1昆明市石林风景区
    5A175元
    长湖景区票价10元7:00—18:00昆明市石林彝族自治县2丽江市玉龙雪山景区
    5A
    205元
    07:00-18:00
    云南省丽江市玉龙纳西族自治县丽江大玉龙旅游景区
    0888-5131111
    3大理崇圣寺三塔文化旅游区
    5A
    110元
    8:00-19:00
    大理古城北门三文笔村
    8:00-19:00
    4中科院西双版纳热带植物园
    5A
    80元
    8:00~18:00
    云南西双版纳省勐腊县勐仑镇
    0691-8715914
    5丽江古城景区
    5A
    门票免费,丽江木府40元
    丽江古城维护费:80元
    全天24小时开放
    云南省丽江市古城区
    6迪庆州香格里拉普达措国家公园
    5A
    100元
    11月~3月8:00~16:00
    4月~10月8:00~17:00
    云南迪庆
    0887--8232533
    7昆明市昆明世博园景区
    5A
    100元,下午两点以后70元
    9:00-17:00
    云南昆明市盘龙区世博路10号
    0871-65012256、65012367
    8云南省保山市腾冲火山热海旅游区
    5A
    火山景区单人票54元,热海景区单人票78元
    火山热海套票132元
    8:00~18:00
    云南省保山市腾冲县离县城10公里

    昆明市石林风景区

    昆明市石林风景区,又称为云南石林,位于昆明石林彝族自治县境内,距离云南省会昆明78公里。范围达350平方公里。昆明市石林风景区开发为游览区的主要是:石林风景区、黑松岩(乃古石林)风景区、飞龙瀑(大叠水)风景区、长湖风景区。

    丽江市玉龙雪山景区

    丽江市玉龙雪山景区是国家旅游局正式批准的5A级国家风景名胜区。位于玉龙纳西族自治县境内,是北半球最南的大雪山。南北长35公里,东西宽13公里,面积960平方公里,主峰扇子陡海拔5596米,高山雪域风景位于海拔4000米以上,拥有险、奇、美、秀的景色。

    大理崇圣寺三塔文化旅游区

    崇圣寺三塔文化旅游区位于中国云南省大理州境内大理古城北,是集苍洱风光、文物古迹、佛教文化、休闲度假为一体的国家5A级旅游景区。景区中的崇圣寺三塔是国务院首批公布的全国重点文物保护单位,为大理的标志和象征  。

    中科院西双版纳热带植物园

    中国科学院西双版纳热带植物园,国家AAAAA级旅游景区,位于中国云南省西双版纳傣族自治州勐腊县勐仑镇葫芦岛,中国面积最大、收集物种最丰富、植物专类园区最多的植物园 ,也是集科学研究、物种保存和科普教育为一体的综合性研究机构和风景名胜区。

    丽江古城景区

    丽江古城内的街道依山傍水修建,以红色角砾岩铺就,有四方街、木府、五凤楼、黑龙潭、文昌宫、王丕震纪念馆、雪山书院、王家庄基督教堂、方国瑜故居、白马龙潭寺、顾彼得旧居、净莲寺、普贤寺等景点。  丽江为第二批被批准的中国历史文化名城之一,是中国以整座古城申报世界文化遗产获得成功的两座古城之一。

    迪庆州香格里拉普达措国家公园

    普达措国家公园,位于滇西北“三江并流”世界自然遗产中心地带,由国际重要湿地碧塔海自然保护区和“三江并流”世界自然遗产哈巴片区之属都湖景区两部分构成,以碧塔海、属都湖和弥里塘亚高山牧场为主要组成部分,也是香格里拉旅游的主要景点之一。
    海拔在3500米至4159米之间,属省级自然保护区,是“三江并流”风景名胜区的重要组成部分。普达措国家公园拥有地质地貌、湖泊湿地、森林草甸、河谷溪流、珍稀动植物等,原始生态环境保存完好。距香格里拉市城区22公里,总面积约1313平方千米。

    昆明市昆明世博园景区

    昆明世界园艺博览园(简称世博园),是1999年昆明世界园艺博览会会址,国家AAAAA级景区
    园区包括五大场馆:国际馆、中国馆、人与自然馆、科技馆和大温室;七大专题展园:树木园、竹园、盆景园、药草园、茶园、蔬菜瓜果园和会后新建的名花艺石园;三大室外展区:国际室外展区、中国室外展区和企业室外展区。

    云南省保山市腾冲火山热海旅游区

    火山和热海是腾冲的两大热点景区,火山景区,全称为“腾冲火山地热国家地质公园”,离热海景区不远,火山公园内的景点有大空山、小空山、黑空山、城子楼火山、黑鱼河、柱状节理等。2002年初,被国土资源部列为国家火山地热地质公园。腾冲也是中国最集中、最壮观、最典型的火山地热区,是第四纪火山活动给人类留下的珍贵遗产,为全国四大火山群之一。

  • 西南 旅游 133 0 1 发布

    贵州,简称“黔”或“贵”,是中华人民共和国省级行政区。省会贵阳,地处中国西南内陆地区腹地。是中国西南地区交通枢纽,长江经济带重要组成部分。全国首个国家级大数据综合试验区,世界知名山地旅游目的地和山地旅游大省,国家生态文明试验区,内陆开放型经济试验区。界于北纬24°37′-29°13′ ,东经103°36′-109°35′,北接四川和重庆,东毗湖南、南邻广西、西连云南。

    主要旅游景点景点等级门票开放时间地址/电话1安顺市黄果树瀑布景区
    5A180元大瀑布
    安顺市镇宁布依族苗族自治县黄果树镇
    0851-866534812
    2安顺龙宫景区
    5A150元(预订优惠)
    08:40-17:00
    贵州省安顺市西秀区境内,距安顺市西南32公里处
    4009661984
    3毕节市百里杜鹃景区
    5A
    50元
    8:00-18:00
    贵州省毕节市大方县普底乡百里杜鹃风景区
    4008967967、0857-4664666
    4黔南州荔波樟江景区
    5A
    淡季90元,旺季110元
    7:30-16:30
    贵州省黔南
    0854-3516116、3619810
    5贵阳市花溪青岩古镇景区
    5A
    60元
    9:00-17:00贵州省贵阳市花溪区青岩镇
    0851-83200400
    6铜仁市梵净山旅游区
    5A
    旺季110元
    淡季90元
    8:00-16:30
    贵州铜仁市的江口县、印江自治县、松桃自治县交界处
    0856-6720000

    安顺市黄果树瀑布景区

    黄果树瀑布,即黄果树大瀑布,是世界著名大瀑布之一,黄果树风景名胜区以黄果树瀑布景区为中心,分布有天星桥景区、陡坡塘景区、滴水滩瀑布景区、郎宫景区、霸陵河峡谷三国古驿道景区、郎宫景区、以石头寨为首的黄果树布依族十大村寨等几大景区。

    安顺龙宫景区

    龙宫风景名胜区,国家5A级景区,位于贵州安顺市西南27千米处的响水龙潭,是一个大型暗湖溶洞。全洞长3500米,穿越20余座山峰,连接90余个洞穴,包括水洞、旱洞、天池、瀑布、石林、峡道及附近布依族石头村寨等。
    龙宫景区集溶洞、峡谷、瀑布、峰林、绝壁、溪河、石林、漏斗、暗河等多种喀斯特地质地貌景观于一体,是喀斯特地貌形态展示最为集中全面的景区,被誉为“天下喀斯特,尽在龙宫”。

    毕节市百里杜鹃景区

    毕节市百里杜鹃景区主要旅游景点有杜鹃林带、百里杜鹃大草原、米底河、杜鹃花王、千年一吻、黄家坝阻击战遗址等。是迄今为止中国已查明的面积最大的原生杜鹃林,素有"杜鹃王国"、"世界天然大花园"的荣誉。

    黔南州荔波樟江景区

    荔波樟江风景名胜区,世界自然遗产,中国最美丽的地方之一,世界遗产中国喀斯特,位于贵州省黔南布衣族苗族自治州荔波县西南部,距县城28公里,由大七孔、小七孔、水春河和樟江风光带四个景区组成,景区集洞、林、湖、瀑、石、水多种景观于一体,玲珑秀丽,令游客耳目常新,有“超级盆景”的美誉。

    贵阳市花溪青岩古镇景区

    青岩古镇,贵州四大古镇之一,位于贵州省贵阳市南郊,建于明洪武十年(1378年),原为军事要塞 。古镇内设计精巧、工艺精湛的明清古建筑交错密布,寺庙、楼阁画栋雕梁、飞角重檐相间。镇人文荟萃,有历史名人周渔璜、清末状元赵以炯(贵州历史上第一个文状元)。镇内有近代史上震惊中外的青岩教案遗址、赵状元府第、平刚先生故居、红军长征作战指挥部等历史文物。周恩来的父亲、邓颖超的母亲、李克农等革命前辈及其家属均在青岩秘密居住过。青岩古镇还是抗战期间浙江大学的西迁办学点之一。

    铜仁市梵净山旅游区

    梵净山被称为“贵州第一名山,武陵第一峰”,无论是自然风景还是人文景观,都极为丰富。梵净山“集黄山之奇,峨眉之秀,华山之险,泰山之雄”,众多奇石是景区内的一大特点,更有佛光、禅雾、幻影和瀑布云四大天象。梵净山也是全国著名的弥勒菩萨道场和中国第五大佛教名山之一,在佛教史上具有重要的地位。

  • 西南 旅游 88 0 1 发布

    四川,简称“川”或“蜀”,是中华人民共和国省级行政区。省会成都,位于中国西南地区内陆,界于北纬26°03′-34°19′,东经97°21′-108°12′之间,东连重庆,南邻云南、贵州,西接西藏,北接陕西、甘肃、青海,四川省总面积48.6万平方千米。


    主要旅游景点景点等级门票开放时间地址/电话1成都市青城山—都江堰旅游景区
    5A

    ①青城山前山:90元;青城山后山:20元;(预订优惠)

    ②都江堰:90元;(预订优惠)都江堰8:00-8:00、青城前山8:00-18:00四川省成都都江堰市青城镇、四川省成都都江堰市城西
    028-87120836
    2乐山市峨眉山景区
    5A
    160元(预订特价155元)
    6:00-18:30
    四川省乐山市中区凌云路2435号
    0833-5520451
    3九寨沟旅游景区
    5A220元
    7:00-19:00
    四川省阿坝州九寨沟县漳扎镇
    0837-7739529
    4乐山市乐山大佛景区
    5A90元(预订优惠价:80元),东方佛都70元
    夏秋季(5月1日-10月7日) 7:30-18:30
    冬春季(10月8日-4月30日)8:00-17:30;
    四川省乐山市南岷江东岸凌云寺
    0833-2302296
    5阿坝藏族羌族自治州黄龙景区
    5A
    250元;缆车上行80元,下行40元
    08:00-18:00
    四川省阿坝
    400-088-6969、0837-7249166、7249055
    6南充市阆中古城旅游景区
    5A
    联票120元/人(单景点20~50不等)
    5月1日~10月7日:08:00~18:30;
    10月8日~4月30日:8:00~18:00;四川阆中市阆水中路33号
    0817-6234599、6234599
    7阿坝州汶川特别旅游区
    5A
    古镇和纪念馆免费,三江50元
    震中纪念馆:08:30-16:30,每周一闭馆,
    古镇:全天
    三江:08:00-18:00;
    四川省阿坝藏族羌族自治州汶川县
    0837-6256799
    8绵阳市北川羌城旅游区
    5A
    地震区免费 、寻龙山60元、维斯特农业观光园50元
    全天
    寻龙山:夏季08:00-18:00,冬季08:30-17:30
    四川省绵阳市北川羌族自治县永昌镇青片路
    0816-4822999、4829611、4822555
    9广安市邓小平故里旅游区
    5A
    免费
    每周二至周日8:30—17:30对外开放;
    非节假日周一闭馆不闭园
    四川省广安市广安区协兴镇牌坊村
    10广元市剑门蜀道剑门关旅游区
    5A剑门关100元、翠云廊50元、索道单程20元,往返30元
    关楼30元、梁山寺30元、关楼+梁山寺通票:50元。
    9:00~18:00
    广元市剑阁县河东街64号
    0839-6750978
    11南充市仪陇朱德故里景区
    5A
    免费
    09:00 - 16:00
    四川省南充市仪陇县马鞍镇
    12甘孜州海螺沟景区
    5A
    160元
    冬春08:00-14:00   夏秋07:00-14:30
    四川省泸定县磨西镇

    成都市青城山—都江堰旅游景区

    世界遗产青城山·都江堰位于成都平原西北部,是"国家级重点风景名胜区"、"国家AAAAA级旅游区"、"全国重点文物保护单位"、"国家级文明风景区"、"全国爱国主义教育示范基地"。

    乐山市峨眉山景区

    乐山市峨眉山景区位于四川省乐山市境内,景区面积154平方公里,最高峰万佛顶海拔3099米。具有“雄、秀、奇、险、幽”的特色,以优美的自然风光、悠久的佛教文化、丰富的动植物资源、独特的地质地貌著称于世,被人们誉为“仙山佛国”、“植物王国”、“动物乐园”、“地质博物馆”。

    阿坝藏族羌族自治州九寨沟旅游景区

    九寨沟位于四川省阿坝藏族羌族自治州九寨沟县境内,地处青藏高原、川西高原、山地向四川盆地过渡地带,南距成都市300多公里,是一条纵深50余千米的山沟谷地,总面积64297公顷,森林覆盖率超过80%。因沟内有树正寨、荷叶寨、则查洼寨等九个藏族村寨坐落在这片高山湖泊群中而得名。

    乐山市乐山大佛景区

    乐山大佛景区位于乐山市郊,岷江、大渡河、青衣江三江交汇处,景区面积17.88平方公里,与乐山城隔江相望,地处凌云山中部,凌云山海拔448米,周长约3.5公里,面积约0.6平方公里。山上茂林修竹终年葱茏,山下三江汇聚,享有西南山水之冠的美誉,为历代文人墨客所咏赞。

    阿坝藏族羌族自治州黄龙景区

    黄龙景区以规模宏大、结构奇巧、色彩丰艳的地表钙华景观为主景,以罕见的岩溶地貌蜚声中外,堪称人间仙境。2016年10月9日,国家旅游局发布十一假日旅游“红黑榜”,黄龙景区上榜综合秩序最佳景区。 [2]  是世界自然遗产,世界人与生物圈保护区,“绿色环球21”证书,国家AAAAA级旅游景区,国家重点风景名胜区。

    南充市阆中古城旅游景区

    阆中古城有张飞庙、永安寺、五龙庙、滕王阁、观音寺、巴巴寺、大佛寺、川北道贡院等8处全国重点文物保护单位;有邵家湾墓群、文笔塔、石室观摩崖造像、雷神洞摩崖造像、牛王洞摩崖造像、红四方面军总政治部旧址、华光楼等22处省级文物保护单位。

    阿坝州汶川特别旅游区

    汶川特别旅游区是2008年5月12日汶川特大地震重建后特别开发的纪念性和文化主题景区。由震中映秀、水磨古镇、三江生态旅游区组成,不仅山水秀丽,具有生物多样性特点,而且历史文化底蕴深厚,民族文化异彩纷呈,生态、地质文化博大精深。自然风光与浓厚的乡土风情、民族文化、人文景观及田园风情交相辉映,独具魅力。

    绵阳市北川羌城旅游区

    绵阳市北川羌城旅游区位于四川盆地西北部北川羌族自治县,由北川地震遗址区、北川新县城,北川地震纪念馆、北川羌族民俗博物馆、吉娜羌寨、维斯特游客中心等景点组成。

    广安市邓小平故里旅游区

    广安市邓小平故里旅游区位于四川省广安市广安区协兴镇,面积3.19平方公里,是集缅怀纪念、爱国主义教育、古镇文化、社会主义新农村展示、休闲度假于一体的复合型旅游景区。
    主要景点有邓小平故居、洗砚池、翰林院子、蚕房院子、北山小学堂、清水塘、神道碑、德政坊等近20处邓小平童年及青少年时期活动场所;经中共中央批准修建的邓小平故居陈列馆、邓小平铜像广场、邓小平缅怀馆等纪念设施;展示社会主义新农村建设成就的牌坊新村;展示古镇文化与建筑艺术的协兴古镇等。

    广元市剑门蜀道剑门关旅游区

    广元市剑门蜀道剑门关旅游区位于四川省广元市剑阁县北部,总面积84平方千米,核心区面积6平方千米。由剑门关、翠云廊两个紧邻景区组成,是四川大九寨环线的重要节点和蜀道三国文化精品旅游线路的支撑中心。 [1] 剑门蜀道历史悠久,肇始于西周,它是先秦古蜀道—金牛道的核心价值地段,历史跨越3000余年,遗存有古桥梁、古建筑、古碑刻、古寺庙、古城址等文物。主要景点有剑门关、姜维墓、钟会故垒、金牛道、后关门、石笋峰、梁山寺、翠屏峰、玻璃景观平台等。

    南充市仪陇朱德故里景区

    朱德故里景区,国家AAAAA级旅游景区、全国重点文物保护单位、全国爱国主义教育示范基地、全国廉政教育基地、全国首批“景区带村”旅游扶贫示范景区、全国100个红色旅游经典景区、中国红色文化旅游精品景区、30条红色精品旅游线路之一,2016年十一假日最佳景区。

    甘孜州海螺沟景区

    海螺沟风景区,国家5A级景区,位于四川甘孜藏族自治州东南部,贡嘎山东坡,是青藏高原东缘的极高山地。海螺沟景区融自然风光、历史文化、茶马文化、红色文化和民俗文化为一身,集观光、休闲、疗养、避暑、生态、科考、探险、登山、摄影等旅游于一体,共同构筑成了四川旅游西环线上最具魅力的旅游目的地。

  • 中南 旅游 103 0 1 发布

    海南省,简称“琼”,是中华人民共和国省级行政区,省会海口。海南省是中国的经济特区、自由贸易试验区(港)。位于中国华南地区,北以琼州海峡与广东划界,西临北部湾与广西、越南相对,东濒南海与台湾对望, 东南和南部在南海与菲律宾、文莱、马来西亚为邻,是中国最南端的省级行政区。海南省海南岛总面积3.54万平方公里,海域面积约200万平方公里。

    主要旅游景点景点等级门票开放时间地址/电话1三亚市南山文化旅游区
    5A108元(预订优惠价:103元)8:00-17:30海南省三亚市崖城镇南山村
    0898-88837888、88837727
    2三亚市南山大小洞天旅游区
    5A75元(预订优惠价:66元)7:00-19:00
    海南省三亚市南山西南隅
    4008488800
    3呀诺达雨林文化旅游区
    5A
    150元(预订优惠价:138元)
    07:30-19:00
    海南保亭县国营三道农场呀诺达雨林景区
    4分界洲岛旅游区
    5A

    ①分界洲岛成人票(含门票、往返船票) 168元;

    ③分界洲岛门票+海洋
    ④分界洲岛门票+海洋馆+午餐套票 325元

    07:30-18:00
    位于陵水县东北部海面上,距东线高速公路牛岭隧道约8海里
    5保亭县槟榔谷黎苗文化旅游区
    5A80元
    8:00-17:30
    海南保亭甘什岭自然保护区
    0898-38660888、38660999
    6三亚市蜈支洲岛旅游区
    5A138元(预订优惠价:133元)
    08:30~17:30,截止上岛时间:16:00
    海南省三亚市海棠湾镇蜈支洲岛
    400-114-6666,0898-88751258

    三亚市南山文化旅游区

    南山文化旅游区位于海南省三亚市西南40公里处,是中国最南端的山,属热带海洋季风性气候,其空气质量和海水质量居全国首位,森林覆盖率为97%,是一座展示中国佛教传统文化的大型园区。南山文化旅游区是国家AAAAA旅游景区,国家重点风景名胜区,全国文明风景旅游区示范点,中国人居环境范例奖,中国佛教名山胜地,中国旅游业发展优先项目,海南省生态旅游示范景区。
    南山主要景点有南山寺、海上观音、不二法门、观音文化苑、天竺圣迹、佛名胜景观苑、十方塔林与归根园、佛教文化交流中心、素斋购物一条街等。其中,108米海上观音是当之无愧的亮点之一,是世界首尊金玉观世音菩萨塑像,闻名全海南的镇岛之宝。

    三亚市南山大小洞天旅游区

    大小洞天风景区,原名海山奇观风景区,古称鳌山大小洞天,位于海南省三亚市区以西40公里的南山西南隅,总面积为22.5平方公里,景区已有800多年历史,是著名的道教文化风景区。

    大小洞天风景区以其秀丽的海景、山景和石景号称琼崖第一山水名胜。风景区内仍有“小洞天”、“钓台”、“海山奇观”、“仙人足”、“试剑峰”等历代诗文摩崖石刻。山、海、林泉是构成一个旅游名胜必不可少的条件。这里,崖州湾弧弦百里,碧波万倾;鳌山云深林翠,岩奇洞幽;海岸遍布神工鬼斧,肖形状物之大小磊群;山海之间宛如一幅古朴雄壮的长卷画图。

    呀诺达雨林文化旅游区

    呀诺达热带雨林景区是中国唯一地处北纬18度的真正热带雨林,是海南岛五大热带雨林精品的浓缩,是最具观赏价值的热带雨林资源博览馆,堪称中国钻石级雨林景区。景区集热带雨林、峡谷奇观、流泉叠瀑、黎峒风情、热带瓜果、南药、温泉多种旅游资源于一身。

    分界洲岛旅游区

    分界洲岛生态文化度假区,国家5A级旅游景区,占地面积0.45平方公里,坐落于海南省海口三亚东线高速公路牛岭15号出口处,是一个极具热带海岛风情特色的海岛型景区。因特殊的地理位置、气候特征、海岛地形、地域文化等,分界洲有“美女岛”、“观音岛”、“无名岛”、“睡佛岛”、“冰火岛”之誉。从海口出发到分界洲是174公里,由三亚出发则只有68公里。
    分界洲自古就无人居住,有非常洁净的海洋环境和丰富的海洋生态资源,是海南最适宜潜水、观赏海底世界的海岛,其生态环境堪比西沙群岛。这个岛屿地貌比较特殊,山、石、水、暗礁等一概具有,海水清澈、能见度好,潜水条件得天独厚,因此吸引了香港、澳门、广东、北京等地的专业潜水人士和游客到分界洲潜水,被国际潜水专家认为是最适宜潜水的胜地之一

    保亭县槟榔谷黎苗文化旅游区

    海南槟榔谷黎苗文化旅游区创建于1998年,地处北纬18°,位于保亭县与三亚市交界的甘什岭自然保护区境内。景区坐落在万余槟榔林海,并置身于古木参天、藤蔓交织的热带雨林中,规划面积5000余亩,距亚龙湾海岸26公里,距三亚市中心28公里。 槟榔谷因其两边森林层峦叠嶂,中间是一条延绵数公里的槟榔谷地而得名。景区由非遗村、甘什黎村、谷银苗家、田野黎家、《槟榔·古韵》大型实景演出、兰花小木屋、黎苗风味美食街七大文化体验区构成,风景秀丽。景区内还展示了十项国家级非物质文化遗产,其中“黎族传统纺染织绣技艺”被联合国教科文组织列入非物质文化遗产急需保护名录。槟榔谷还是海南黎、苗族传统“三月三”及“七夕嬉水节”的主要活动举办地之一,文化魅力十足,是海南民族文化的“活化石”。

    三亚市蜈支洲岛旅游区

    蜈支洲岛,AAAAA级景区,坐落在三亚蜈支洲岛是海南岛周围为数不多的有淡水资源和丰富植被的小岛,该岛东、南两峰相连,最高峰为79.9米,悬崖壁立。

  • 中南 旅游 93 0 1 发布

    广西壮族自治区,简称“桂”,是中华人民共和国省级行政区,位于中国华南地区,广西界于北纬20°54′-26°24′,东经104°28′-112°04′之间,东界广东,南临北部湾并与海南隔海相望,西与云南毗邻,东北接湖南,西北靠贵州,西南与越南接壤,广西陆地面积23.76万平方千米,海域面积约4万平方千米。

    主要旅游景点景点等级门票开放时间地址/电话1桂林市漓江景区
    5A210元7:00-18:00广西壮族自治区东部2桂林市乐满地度假世界
    5A通票150元(预订优惠价:125元)3-6月 9:00-17:30,
    7-8月 8:30-18:00,
    9-10月 9:00-17:30,
    1、2、11、12月 9:00-17:00广西壮族自治区桂林市兴安县
    0773-6236789、62298983桂林市独秀峰-王城景区
    5A100元
    春秋季:7:30-18:00(3月1日-4月30日;10月8日-12月7日)
    夏季:7:30-18:30(5月1日-10月7日)
    冬季:8:00-18:00(12月8日-次年2月28日)广西
    0773-2851941、2803149
    4南宁市青秀山旅游区
    20元
    7:00~24:00
    广西南宁青山路19号
    0771-5828923、5560662
    5桂林市两江四湖·象山景区
    夜游两江四湖:成人190元,儿童125元。
    旺季每天18:00-23:00 淡季每天19:00-21:30 ,
    6崇左市德天跨国瀑布景区
    大门115元、竹筏10元
    全天
    广西壮族自治区崇左
    0771-5595608

    桂林市漓江景区

    桂林市漓江景区位于广西壮族自治区东部,是世界上规模最大、风景最美的岩溶山水游览区之一 。

    桂林市漓江景区是广西东北部喀斯特地貌发育最典型的地区,主要景点有象鼻山、冠岩、黄布倒影和仙人推磨等自然景观,人称“百里漓江、百里画廊”。2007年,桂林市漓江景区被评为国家AAAAA级旅游区。

    桂林市乐满地度假世界

    桂林乐满地度假世界是广西目前最大的外商投资旅游项目,占地面积共6000亩,于2000年12月25日正式开幕,其中包括时尚、动感、刺激与欢乐并存的主题乐园。现为国家首批5A级旅游景区。在兴安县灵湖景区6000余亩的土地上,融合桂林山水之美、广西少数民族艺术及乐满地欢乐文化的度假酒店,闲逸高雅,隐晰山林间,尽享自然特色;美式丘陵国际标准36洞高尔夫球场,独揽桂林山水盛景,挑战您的极至尊荣;缤纷主题乐园,时尚、动感、刺激与欢乐并存。这些构成了集尊贵、自然、浪漫、闲逸、欢乐为一体的度假胜地——桂林乐满地度假世界。

    桂林市独秀峰-王城景区

    1独秀峰·王城景区,国家AAAAA级景区,占地面积20平方公里,位于桂林市漓江之畔,是以山形秀美的独秀峰为代表和整个明代靖江王府为地域范围的景区。景区内自然山水风光与历史人文景观交相辉映,自古以来就有“城中城”的美誉。

    南宁市青秀山旅游区

    青秀山风景区位于广西壮族自治区南宁市青秀区凤岭南路,是国家AAAAA级旅游景区。青秀山是南宁市重点开发的风景区,除保护和修复原有的古迹如董泉、撷青岩崖刻,石香灶等外,还新建了不少景点。

    青秀山风景区包括凤凰岭,凤翼岭和青秀山,海拔高度八十二米至二百八十九米,气候宜人,奇山异卉,四季常开,古诗曰:“青山四时常不老,游子天崖觉春好,我携春色上山来,山花片片迎春开。”在古代,青秀山已经是邕南著名的避暑游览胜地。

    桂林市两江四湖·象山景区

    桂林“两江四湖”,即指漓江、桃花江、木龙湖(含铁佛塘)、桂湖、榕湖、杉湖,其环城水系全长7.33公里,水面面积38.59万平方米。该工程最早形成于北宋年间(960-1127年),当时榕湖、杉湖、桂湖上舟楫纵横,游人如织,兴盛一时。
    桂林两江四湖构成桂林山水美景的重要组成部分。文章对桂林两江四湖的工程概况、社会效益、规划进程和展示的炫丽美景做了详细的描述,十分引人入胜。

    崇左市德天跨国瀑布景区

    德天瀑布位于广西壮族自治区崇左市大新县硕龙镇德天村,中国与越南边境处的归春河上游,瀑布气势磅礴、蔚为壮观,与紧邻的越南板约瀑布(“Bản Giốc & Đức Thiên”)相连,是亚洲第一、世界第四大跨国瀑布,年均水流量约为贵州黄果树瀑布的三倍,为中国国家AAAAA级旅游景区 。   还是《酒是故乡醇》和《花千骨》的外景拍摄地,神奇而美妙。